Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

toUpperCase也有兼容差异?

  Unicode是个神奇的东西,也许汉语和英语在Unicode中并没有什么特别的地方,但是有些语言自身很特殊,它们在Unicode中的存在也特别诡异。就说我们熟知的大小写转换函数,不仅是英文字母有大小写,其它语言也有,而且甚至大小写都不是双映射的。
  比如一个德文字符“ß”,它的大写是什么? <script>
alert("ß".toUpperCase());
</script>
  Chrome上把它的大写当做“SS”,Firefox和IE下不做转换,至少我现在的环境下测试得到的是这样的结果。我们要惊讶的有两件事,第一是toUpperCase居然有兼容性差异,第二是toUpperCase居然可以让一个字符转化成两个字符。
  在Chrome中,很多字符被转换以后都是加上一些组合字符,因此转换后整个字符长度就增加了。一个字符转换成大写后不仅可能变成两个字符,还可以变成三个字符。再调用toLowerCase函数也未必可以把结果转换回原来的字符。
  下面我写了个测试,大概可以列出那些奇葩的字符。不过在我的环境下测试只有Chrome可以列出来,其它浏览器对于奇葩字符都是充耳不闻的态度。
<script>
onload=function(){
  var i=0x10000,c,u,s=[],t=document.createElement("table"),r;
  while(--i){
    c=String.fromCharCode(i),u=c.toUpperCase();
    if(u.length==1)continue;
    r=t.insertRow();
    r.insertCell(-1).textContent=i;
    r.insertCell(-1).textContent=c;
    r.insertCell(-1).textContent=u;
    r.insertCell(-1).textContent=u.length;
  };
  r=t.insertRow();
  r.insertCell(-1).textContent="代码";
  r.insertCell(-1).textContent="字符";
  r.insertCell(-1).textContent="大写";
  r.insertCell(-1).textContent="长度";
  t.border=1;
  document.body.appendChild(t);
};
</script>
  当然,如果有兴趣也可以试试toLowerCase,其实同样的道理。很多字符的大小写转换是存在争议的,所以实现起来就有差异。不过至少我们可以确定英文字母的大小写映射,这是全宇宙统一的。
网名:
3.80.55.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^