UTF.COM.CN

UTF-8编码的详细讲解

作者:佚名 | 来源:网络 | 添加时间:2006-02-22 11:19:18 | 人气:75906

UTF-8编码的详细讲解(3)

在 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 有一下特性:  

UCS 字符 U+0000 到 U+007F (ASCII) 被编码为字节 0x00 到 0x7F (ASCII 兼容). 这意味着只包含 7 位 ASCII 字符的文件在 ASCII 和 UTF-8 两种编码方式下是一样的.  
所有 >U+007F 的 UCS 字符被编码为一个多个字节的串, 每个字节都有标记位集. 因此, ASCII 字节 (0x00-0x7F) 不可能作为任何其他字符的一部分.  
表示非 ASCII 字符的多字节串的第一个字节总是在 0xC0 到 0xFD 的范围里, 并指出这个字符包含多少个字节. 多字节串的其余字节都在 0x80 到 0xBF 范围里. 这使得重新同步非常容易, 并使编码无国界, 且很少受丢失字节的影响.  
可以编入所有可能的 231个 UCS 代码  
UTF-8 编码字符理论上可以最多到 6 个字节长, 然而 16 位 BMP 字符最多只用到 3 字节长.  
Bigendian UCS-4 字节串的排列顺序是预定的.  
字节 0xFE 和 0xFF 在 UTF-8 编码中从未用到.  
下列字节串用来表示一个字符. 用到哪个串取决于该字符在 Unicode 中的序号. 

U-00000000 - U-0000007F: 0xxxxxxx  
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, 当然除非你指的是一个变量名而不是这种编码本身. 

什么编程语言支持 Unicode? 
在大约 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 字符. 

在 Linux 下该如何使用 Unicode? 
在 UTF-8 之前, 不同地区的 Linux 用户使用各种各样的 ASCII 扩展. 最普遍的欧洲编码是 ISO 8859-1 和 ISO 8859-2, 希腊编码 ISO 8859-7, 俄国编码 KOI-8, 日本编码 EUC 和 Shift-JIS, 等等. 这使得 文件的交换非常困难, 且应用软件必须特别关心这些编码的不同之处. 

最终, Unicode 将取代所有这些编码, 主要通过 UTF-8 的形式. UTF-8 将应用在  

文本文件 (源代码, HTML 文件, email 消息, 等等) 
责任编辑:冬天来了
【字号: 】【去论坛讨论】【发表评论】【打印本文】【告诉好友】【关闭窗口
网友评论(评论内容只代表网友观点,与本站立场无关!)
  • 的 发表于:2008-03-28 11:43:56
    点击进入与“UTF-8编码的详细讲解”相关的网站
  • 流氓 发表于:2008-03-28 11:43:14
    流氓

    [url="http://www.liumang.com/"]流氓[/url]

    <A href=http://www.liumang.com/>流氓</a>

    <A href="http://www.liumang.com/">流氓</a>

  • s 发表于:2008-03-05 14:24:07
    s
  • 天外来客 发表于:2007-11-30 18:03:27
    最终, Unicode 将取代所有这些编码, 主要通过 UTF-8 的形式?事实上unicode编码方式用的越来越广泛。
  • 天外来客 发表于:2007-11-30 18:01:57
    gb2312编码过于随便,而gb18030对未了向前兼容也只能仍然“随便”
  • 柜体 发表于:2007-10-29 16:37:58
    多幅随风倒撒
  • celsl 发表于:2007-10-29 16:36:38
    ceshi 游戏测试
  • xxxxx 发表于:2007-07-04 15:24:10
    vxvxcvxcv
  • 路过 发表于:2006-09-08 11:25:48
    德语中的元音变音是指 “A“上面加横着排列的两点,用于标识读音的变化,加两点的这个“动作字符“离开相应的字母单独显示也没有意义,这也是一个combining charactor。
  • 路过 发表于:2006-09-08 11:20:33
    这种科技文献的翻译确实很难,最搞笑的莫过于“汉语拼音(Bopomofo)“了,老外的造字术倒是很简洁。关于“什么是组合字符?”写一点注记。“编码点”是指那些待分配的编码、那些UCS位置。“无间隔重音”就是指英语音标表示重音的那一撇,它不单独占一格,而是和相应的字符紧挨在一起的,它只是一个标记不单独显示为一个字符,UCS和旧编码中都有单独的编码用来表示例如 “`A”这种情况,也就是有一组编码逐一列出所有的情况,这些编码对应的字符叫“预作字符”, “`A”作为一个整体保存的,这样当然不够方便,所以UCS另外给出了一种表示方法把重音符号从加重的预作字符里分离出来,使用时加以组合,这种被分离出来的符号统称为(除了重音符号还有下面提到的“变音符号”)“组合字符”(combining charactor),"组合字符”的译法我个人有保留意见,太简单化,combining charactor这个概念其实很特殊化和生僻,这种简单的直译容易让人误解。 “正字法”有一个同义词叫“缀音法”,我认为应该采用这个词更易于理解什么是combining charactor。

姓名:

验证码: 点击刷新