UCS & BOM

UCS

UCS,全称为Universal Multiple-Octet Coded Character Set (UCS),是所有其他字符集标准的一个超集。它保证与其他字符集是双向兼容的,就是说,如果你将任何文本字符串翻译到 UCS格式,然后再翻译回原编码,你不会丢失任何信息。

UCS 包含了用于表达所有已知语言的字符. 不仅包括拉丁语,希腊语,斯拉夫语,希伯来语,阿拉伯语,亚美尼亚语和乔治亚语的描述,还包括中文,日文和韩文这样的象形文字,以及 平假名,片假名,孟加拉语,旁遮普语果鲁穆奇字符(Gurmukhi),泰米尔语,印.埃纳德语(Kannada),Malayalam,泰国语,老挝语,汉语拼音(Bopomofo),Hangul,Devangari,Gujarati,Oriya,Telugu 以及其他数也数不清的语. 对于还没有加入的语言,由于正在研究怎样在计算机中最好地编码它们,因而最终它们都将被加入. 这些语言包括 Tibetian,高棉语,Runic(古代北欧文字),埃塞俄比亚语,其他象形文字,以及各种各样的印-欧语系的语言,还包括挑选出来的艺术语言比如 Tengwar,Cirth 和克林贡语(Klingon). UCS 还包括大量的图形的,印刷用的,数学用的和科学用的符号,包括所有由 TeX,Postscript,MS-DOS[2],MS-Windows,Macintosh,OCR字体,以及许多其他字处理和出版系统提供的字符.
ISO 10646 定义了一个 31 位的字符集. 然而,在这巨大的编码空间中,迄今为止只分配了前 65534 个码位 (0x0000 到 0xFFFD). 这个 UCS 的 16位子集称为 基本多语言面 (Basic Multilingual Plane,BMP). 将被编码在 16 位 BMP 以外的字符都属于非常特殊的字符(比如象形文字),且只有专家在历史和科学领域里才会用到它们. 按当前的计划,将来也许再也不会有字符被分配到从 0x000000 到 0x10FFFF 这个覆盖了超过 100 万个潜在的未来字符的 21 位的编码空间以外去了. ISO 10646-1 标准第一次发表于 1993 年,定义了字符集与 BMP 中内容的架构. 定义 BMP 以外的字符编码的第二部分 ISO 10646-2 正在准备中,但也许要过好几年才能完成. 新的字符仍源源不断地加入到 BMP 中,但已经存在的字符是稳定的且不会再改变了.
UCS 不仅给每个字符分配一个代码,而且赋予了一个正式的名字. 表示一个 UCS 或 Unicode 值的十六进制数,通常在前面加上 "U+",就象 U+0041 代表字符"拉丁大写字母A". UCS 字符 U+0000 到 U+007F 与 US-ASCⅡ(ISO 646) 是一致的,U+0000 到 U+00FF 与ISO 8859-1(Latin-1) 也是一致的. 从 U+E000 到 U+F8FF,已经 BMP 以外的大范围的编码是为私用保留的.
UCS的实际表现形式为UTF-8/UTF-16/UTF-32编码.

BOM
BOM —— Byte Order Mark,中文名译作“字节顺序标记”。在这里找到一段关于 BOM 的说明:
在UCS 编码中有一个叫做 "Zero Width No-Break Space" ,中文译名作“零宽无间断间隔”的字符,它的编码是 FEFF。而 FFFE 在 UCS 中是不存在的字符,所以不应该出现在实际传输中。UCS 规范建议我们在传输字节流前,先传输字符 "Zero Width No-Break Space"。这样如果接收者收到 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 来标记文本文件的编码方式的。
字符U+FEFF如果出现在字节流的开头,则用来标识该字节流的字节序,是高位在前还是低位在前。如果它出现在字节流的中间,则表达零宽度非换行空格的意义,用户看起来就是一个空格。从Unicode3.2开始,U+FEFF只能出现在字节流的开头,只能用于标识字节序,就如它的名称——字节序标记——所表示的一样;除此以外的用法已被舍弃。取而代之的是,使用U+2060来表达零宽度无断空白。
类似WINDOWS自带的记事本等软件,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。对于一般的文件,这样并不会产生什么麻烦。但对于 PHP来说,BOM是个大麻烦。
PHP并不会忽略BOM,所以在读取、包含或者引用这些文件时,会把BOM作为该文件开头正文的一部分。根据嵌入式语言的特点,这串字符将被直接执行(显示)出来。由此造成即使页面的 top padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个字符呢!

摘自百度百科 http://baike.baidu.com/view/935284.htm#sub10973349 & http://baike.baidu.com/view/126558.htm#sub5073178

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章