在UCS 编码中有一个叫作"ZERO WIDTH NO-BREAK SPACE"的字符,它的编码是FEFF。
而FFFE在UCS中是不存在的字符,因此不该该出如今实际传输中。
UCS规范建议咱们在传输字节流前,先传输字符"ZERO WIDTH NO-BREAK SPACE"。windows
这样接受者若是收到FEFF,就代表这个字节流是Big-Endian的;
若是收到FFFE,就代表这个字节流是Little- Endian的。
所以字符"ZERO WIDTH NO-BREAK SPACE"又被称做BOM。网络
UTF-8不须要BOM来 代表字节顺序,但能够用BOM来 代表编码方式。
字符"ZERO WIDTH NO-BREAK SPACE"的UTF-8编码是EF BB BF。
因此若是接收者收到以EF BB BF开头的字节流,就知道这是UTF-8编码了。函数
Windows就是使用BOM来标记文本文件的编码方式的。编码
在UTF-16里原本是FF FE,变成UTF-8就成了EF BB BF。
这个标记是可选的,由于UTF8字节没有顺序,因此它能够被用来检测一个字节流是不是UTF-8编码的。
微软作这种检测,但有些软件不作这种检测, 而把它看成正常字符处理。spa
微软在本身的UTF-8格式的文本文件以前加上了EF BB BF三个字节, windows上面的notepad等程序就是根据这三个字节来肯定一个文本文件是ASCII的仍是UTF-8的, 然而这个只是微软暗自做的标记, 其它平台上并无对UTF-8文本文件作个这样的标记。code
也就是说一个UTF-8文件可能有BOM,也可能没有BOM,那么怎么区分呢?
三种方法:
1,用UltraEdit-32打开文件,切换到十六进制编辑模 式,察看文件头部是否有EF BB BF。
2,用Dreamweaver打开,察看页面属性,看“包括Unicode签名BOM”前面是否有个勾。
3,用Windows的记事本打开,选择 “另存为”,看文件的默认编码是UTF-8仍是ANSI,若是是ANSI则不带BOM。内存
另 外还有一些编码的小知识:
所谓的unicode保存的文件其实是utf-16,只不过刚好跟unicode的码相同而已,但在概念上unicode与 utf是两回事,unicode是内存编码表示方案,而utf是如何保存和传输unicode的方案。
utf-16还分高位在前 (LE)和高位在后(BE)两种。官方的utf编码还有utf-32,也分LE和BE。
非unicode官方的utf编码还有utf-7,主要用于邮件传 输。
utf-8的单字节部分是和iso-8859-1兼容的,这主要是一些旧的系统和库函数不能正确处理utf-16而被迫出来的,并且对英语字符来讲, 也节省保存的文件空间(以非英语字符浪费空间为代价)。
在iso-8859-1的时候,utf8和iso-8859-1都是用一个字节表示的,当表示其它 字符的时候,utf-8会使用两个或三个字节
utf-8