• 12
  • 2月

刚刚看了《汉化教学文集2006》中的几篇文章,谈到了字符编码问题。终于明白了ASCII,Unicode,Unicode big endian,UTF-8的关系。

ASCII:学过计算机基础的都知道,8bits的英文编码。实际只用低7位,127个字符,32(0x20)为空格,之前是控制字符,之后是有效字符。当>128时,需要使用代码页(code page)来确定表示的字符。在保存文件时一般ANSI项就是指它。

Unicode:使 用两个字节对全球字符进行统一编码,有65536个编码。学名“UCS”——“Universal Multiple-Octet Coded Character Set”.UCS-2为两字节版本,UCS-4为四字节版本,目前两个版本内容是一样的(字符数还没超过2个字节能表示的范围)。

Unicode little endian:将Unicode中表示同一个字符的两个字节顺序返过来。主要目的是为了适应CPU处理字符的方式,加快处理速度。在Windows上为Unicode的默认存储方式(记事本保存对话框中的那个“Unicode”就是这个)。

Unicode big endian:Unicode字符编码以正序存储。非默认。

引用一段原文:

//  “endian”这个词出自《格列佛游记》。小人国的内战就源于吃鸡蛋时是究竟从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开,由此曾发生过六次叛乱,一个皇帝送了命,另一个丢了王位。

我们一般将endian翻译成“字节序”,将big endian和little endian称作“大尾”和“小尾”。  //

应该可以说明问题。

UTF-8:Unicode的一种传输及存储方式,主要是为了消除编码中那些0x0000的字节和减少存储英文时所占用的空间。

以下是Unicode(UCS-4)和UTF-8之间的转换关系表:
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

Unicode编码转换到UTF-8,简单的把Unicode字节流套到x中就变成UTF-8了。

BMP:Basic Multilingual Plane,UCS-4中0x0000—-这些字符。

引用一下原文:
//  UCS有两种格式:UCS-2和UCS-4。顾名思义,UCS-2就是用两个字节编码,UCS-4就是用4个字节(实际上只用了31位,最高位必须为0)编码。下面让我们做一些简单的数学游戏:

UCS-2有2^16=65536个码位,UCS-4有2^31=2147483648个码位。

UCS -4根据最高位为0的最高字节(引注:即第一个字节)分成2^7=128个group。每个group再根据次高字节分为256个plane。每个 plane根据第3个字节分为256行 (rows),每行包含256个cells。当然同一行的cells只是最后一个字节不同,其余都相同。

group 0的plane 0被称作Basic Multilingual Plane, 即BMP。或者说UCS-4中,高两个字节为0的码位被称作BMP。

将UCS-4的BMP去掉前面的两个零字节就得到了UCS-2。在UCS-2的两个字节前加上两个零字节,就得到了UCS-4的BMP。而目前的UCS-4规范中还没有任何字符被分配在BMP之外。  //

BOM:Byte Order Mark,字节序,用以区分Unicode little endian与Unicode big endian。即使用名为”ZERO WIDTH NO-BREAK SPACE”的字符“0xFEFF”传输及存储时首先处理该字符。若读到FEFF,就表明这个字节流是Big-Endian的;而如果是FFFE,就表明 这个字节流是Little-Endian的。

以下为引用:
//  UTF-8不需要它来表明字节顺序,但但可以用BOM来表明编码方式。字符”ZERO WIDTH NO-BREAK SPACE”的UTF-8编码是EF BB BF。所以如果接收者收到以EF BB BF开头的字节流,就知道这是UTF-8编码了。 //

Windows就是使用BOM来标记文本文件的编码方式的。

区位码与GB2312之间的关系:
引用原文:
//  再说区位码,啊的区位码是1601,写成16进制是0x10,0x01。这和计算机广泛使用的ASCII编码冲突。为了兼容00-7f的ASCII编码, 我们在区位码的高、低字节上分别加上A0。这样“啊”的编码就成为B0A1。我们将加过两个A0的编码也称为GB2312编码,虽然GB2312的原文根 本没提到这一点。 //

标签:

您可以对这篇文章发表一条评论,或者在您自己的网站中引用 (Trackback) 它

发表一条评论

所有标签:.net Ajax Java javascript Linux map MySQL RSS TD-SCDMA Ubuntu vim web Win7 乱码 基础知识 备份 奥运会 希望泉 性能 缓存 编程