关于Unicode 65279

2012-04-09

昨天碰到一个很诡异的问题,在客户端使用js将一段html插入一个div(div.innerHTML=html)的时候多出了一个空行。下面在Google chrome里面模拟一下昨天的情况,截图如下:

65279

后来我就获取了这个元素,看了下这个空行是什么,测试流程如下:

65279

当看到比较结果是false的时候被震到了,后来找了下65279的相关资料。65279的十六进制表示为FEFF,它是字节顺序标记(英语:byte-order mark,BOM)是位于码点U+FEFF的统一码字符的名称。当以UTF-16或UTF-32来将UCS/统一码字符所组成的字串编码时,这个字符被用来标示其字节序。它常被用来当做标示文件是以UTF-8、UTF-16或UTF-32编码的记号。(via:wikipedia)

在notepad++中可以设置文件的编码格式,我的默认设置是UTF-8编码格式,这个格式会默认给添加上BOM,而UTF-8无BOM格式则不会添加这个BOM。其实昨天引发这个问题的原因就是,我用模板的方式构造页面,而模板文件使用的是UTF-8编码格式,获取的时候自然就带上了这个BOM。这个BOM有的时候会使浏览器以怪异模式进行渲染,这样就会有更多的问题了。因为BOM是针对于UTF-16和UTF-32的,对于使用UTF-8编码格式的文件不需要BOM,所以在保存UTF-8文件是最好选择无BOM的编码。

然后unicode中还有其他的一些空白字符和部分非打印字符也会导致这种问题,不过遇到的机会很少。

参考资料

字符集和字符编码(Charset & Encoding)
空格
控制字符
字节顺序标记