unicode.org制定的编码机制, 要将全世界经常使用文字都函括进去.
在1.0中是16位编码, 由U+0000到U+FFFF. 每一个2byte码对应一个字符; 在2.0开始抛弃了16位限制, 原来的16位做为基本位平面, 另外增长了16个位平面, 至关于20位编码, 编码范围0到0x10FFFF.html
UCS: 算法
ISO制定的ISO10646标准所定义的 Universal Character Set, 采用4byte编码.编程
Unicode与UCS的关系:网络
ISO与unicode.org是两个不一样的组织, 所以最初制定了不一样的标准; 但自从unicode2.0开始, unicode采用了与ISO 10646-1相同的字库和字码, ISO也承诺ISO10646将不会给超出0x10FFFF的UCS-4编码赋值, 使得二者保持一致.架构
UCS的编码方式:编程语言
UTF: Unicode/UCS Transformation Formatide
UTF与unicode的关系:函数
Unicode是一个字符集, 能够看做为内码.
而UTF是一种编码方式, 它的出现是由于unicode不适宜在某些场合直接传输和处理. UTF-16直接就是unicode编码, 没有变换, 但它包含了0x00在编码内, 头256字节码的第一个byte都是0x00, 在操做系统(C语言)中有特殊意义, 会引发问题. 采用UTF-8编码对unicode的直接编码做些变换能够避免这问题, 并带来一些优势.工具
中国国标编码:字体
-------------------------------
国际标准 ISO 10646 定义了 通用字符集 (Universal Character Set, UCS). UCS 是全部其余字符集标准的一个超集. 它保证与其余字符集是双向兼容的. 就是说, 若是你将任何文本字符串翻译到 UCS格式, 而后再翻译回原编码, 你不会丢失任何信息.
UCS 包含了用于表达全部已知语言的字符. 不只包括拉丁语,希腊语, 斯拉夫语,希伯来语,阿拉伯语,亚美尼亚语和乔治亚语的描述, 还包括中文, 日文和韩文这样的象形文字, 以及 平假名, 片假名, 孟加拉语, 旁遮普语果鲁穆奇字符(Gurmukhi), 泰米尔语, 印.埃纳德语(Kannada), Malayalam, 泰国语, 老挝语, 汉语拼音(Bopomofo), Hangul, Devangari, Gujarati, Oriya, Telugu 以及其余数也数不清的语. 对于尚未加入的语言, 因为正在研究怎样在计算机中最好地编码它们, 于是最终它们都将被加入. 这些语言包括 Tibetian, 高棉语, Runic(古代北欧文字), 埃塞俄比亚语, 其余象形文字, 以及各类各样的印-欧语系的语言, 还包括挑选出来的艺术语言好比 Tengwar, Cirth 和 克林贡语(Klingon). UCS 还包括大量的图形的, 印刷用的, 数学用的和科学用的符号, 包括全部由 TeX, Postscript, MS-DOS,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-ASCII(ISO 646) 是一致的, U+0000 到 U+00FF 与 ISO 8859-1(Latin-1) 也是一致的. 从 U+E000 到 U+F8FF, 已经 BMP 之外的大范围的编码是为私用保留的.
UCS里有些编码点分配给了 组合字符.它们相似于打字机上的无间隔重音键. 单个的组合字符不是一个完整的字符. 它是一个相似于重音符或其余指示标记, 加在前一个字符后面. 于是, 重音符能够加在任何字符后面. 那些最重要的被加剧的字符, 就象普通语言的正字法(orthographies of common languages)里用到的那种, 在 UCS 里都有本身的位置, 以确保同老的字符集的向后兼容性. 既有本身的编码位置, 又能够表示为一个普通字符跟随一个组合字符的被加剧字符, 被称为 预做字符(precomposed characters). UCS 里的预做字符是为了同没有预做字符的旧编码, 好比 ISO 8859, 保持向后兼容性而设的. 组合字符机制容许在任何字符后加上重音符或其余指示标记, 这在科学符号中特别有用, 好比数学方程式和国际音标字母, 可能会须要在一个基本字符后组合上一个或多个指示标记.
组合字符跟随着被修饰的字符. 好比, 德语中的元音变音字符 ("拉丁大写字母A 加上分音符"), 既能够表示为 UCS 码 U+00C4 的预做字符, 也能够表示成一个普通 "拉丁大写字母A" 跟着一个"组合分音符":U+0041 U+0308 这样的组合. 当须要堆叠多个重音符, 或在一个基本字符的上面和下面都要加上组合标记时, 可使用多个组合字符. 好比在泰国文中, 一个基本字符最多可加上两个组合字符.
不是全部的系统都须要支持象组合字符这样的 UCS 里全部的先进机制. 所以 ISO 10646 指定了下列三种实现级别:
历史上, 有两个独立的, 创立单一字符集的尝试. 一个是国际标准化组织(ISO)的 ISO 10646 项目, 另外一个是由(一开始大可能是美国的)多语言软件制造商组成的协会组织的 Unicode 项目. 幸运的是, 1991年先后, 两个项目的参与者都认识到, 世界不须要两个不一样的单一字符集. 它们合并双方的工做成果, 并为创立一个单一编码表而协同工做. 两个项目仍都存在并独立地公布各自的标准, 但 Unicode 协会和 ISO/IEC JTC1/SC2 都赞成保持 Unicode 和 ISO 10646 标准的码表兼容, 并紧密地共同调整任何将来的扩展.
Unicode 协会公布的 Unicode 标准 严密地包含了 ISO 10646-1 实现级别3的基本多语言面. 在两个标准里全部的字符都在相同的位置而且有相同的名字.
Unicode 标准额外定义了许多与字符有关的语义符号学, 通常而言是对于实现高质量的印刷出版系统的更好的参考. Unicode 详细说明了绘制某些语言(好比阿拉伯语)表达形式的算法, 处理双向文字(好比拉丁与希伯来文混合文字)的算法和 排序与字符串比较 所需的算法, 以及其余许多东西.
另外一方面, ISO 10646 标准, 就象广为人知的 ISO 8859 标准同样, 只不过是一个简单的字符集表. 它指定了一些与标准有关的术语, 定义了一些编码的别名, 并包括了规范说明, 指定了怎样使用 UCS 链接其余 ISO 标准的实现, 好比 ISO 6429 和 ISO 2022. 还有一些与 ISO 紧密相关的, 好比 ISO 14651 是关于 UCS 字符串排序的.
考虑到 Unicode 标准有一个易记的名字, 且在任何好的书店里的 Addison-Wesley 里有, 只花费 ISO 版本的一小部分, 且包括更多的辅助信息, 于是它成为使用普遍得多的参考也就不足为奇了. 然而, 通常认为, 用于打印 ISO 10646-1 标准的字体在某些方面的质量要高于用于打印 Unicode 2.0的. 专业字体设计者老是被建议说要两个标准都实现, 但一些提供的样例字形有显著的区别. ISO 10646-1 标准一样使用四种不一样的风格变体来显示表意文字如中文, 日文和韩文 (CJK), 而 Unicode 2.0 的表里只有中文的变体. 这致使了广泛的认为 Unicode 对日本用户来讲是不可接收的传说, 尽管是错误的.
首先 UCS 和 Unicode 只是分配整数给字符的编码表. 如今存在好几种将一串字符表示为一串字节的方法. 最显而易见的两种方法是将 Unicode 文本存储为 2 个 或 4 个字节序列的串. 这两种方法的正式名称分别为 UCS-2 和 UCS-4. 除非另外指定, 不然大多数的字节都是这样的(Bigendian convention). 将一个 ASCII 或 Latin-1 的文件转换成 UCS-2 只需简单地在每一个 ASCII 字节前插入 0x00. 若是要转换成 UCS-4, 则必须在每一个 ASCII 字节前插入三个 0x00.
在 Unix 下使用 UCS-2 (或 UCS-4) 会致使很是严重的问题. 用这些编码的字符串会包含一些特殊的字符, 好比 '\0' 或 '/', 它们在 文件名和其余 C 库函数参数里都有特别的含义. 另外, 大多数使用 ASCII 文件的 UNIX 下的工具, 若是不进行重大修改是没法读取 16 位的字符的. 基于这些缘由, 在文件名, 文本文件, 环境变量等地方, UCS-2 不适合做为 Unicode 的外部编码.
在 ISO 10646-1 Annex R 和 RFC 2279 里定义的 UTF-8 编码没有这些问题. 它是在 Unix 风格的操做系统下使用 Unicode 的明显的方法.
UTF-8 有一下特性:
下列字节串用来表示一个字符. 用到哪一个串取决于该字符在 Unicode 中的序号.
U-00000000 - U-0000007F: | xxxxxxx |
U-00000080 - U-000007FF: | 110xxxxx 10xxxxxx |
U-00000800 - U-0000FFFF: | 1110xxxx 10xxxxxx 10xxxxxx |
U-00010000 - U-001FFFFF: | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
U-00200000 - U-03FFFFFF: | 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx |
U-04000000 - U-7FFFFFFF: | 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx |
xxx 的位置由字符编码数的二进制表示的位填入. 越靠右的 x 具备越少的特殊意义. 只用最短的那个足够表达一个字符编码数的多字节串. 注意在多字节串中, 第一个字节的开头"1"的数目就是整个串中字节的数目.
例如: Unicode 字符 U+00A9 = 1010 1001 (版权符号) 在 UTF-8 里的编码为:
11000010 10101001 = 0xC2 0xA9
而字符 U+2260 = 0010 0010 0110 0000 (不等于) 编码为:
11100010 10001001 10100000 = 0xE2 0x89 0xA0
这种编码的官方名字拼写为 UTF-8, 其中 UTF 表明 UCS Transformation Format. 请勿在任何文档中用其余名字 (好比 utf8 或 UTF_8) 来表示 UTF-8, 固然除非你指的是一个变量名而不是这种编码自己.
在大约 1993 年以后开发的大多数现代编程语言都有一个特别的数据类型, 叫作 Unicode/ISO 10646-1 字符. 在 Ada95 中叫 Wide_Character, 在 Java 中叫 char.
ISO C 也详细说明了处理多字节编码和宽字符 (wide characters) 的机制, 1994 年 9 月 Amendment 1 to ISO C 发表时又加入了更多. 这些机制主要是为各种东亚编码而设计的, 它们比处理 UCS 所需的要健壮得多. UTF-8 是 ISO C 标准调用多字节字符串的编码的一个例子, wchar_t 类型能够用来存放 Unicode 字符.