我要投搞

标签云

收藏小站

爱尚经典语录、名言、句子、散文、日志、唯美图片

当前位置:主页 > 编码字符 >

字符编码(理论篇)【转】

归档日期:10-15       文本归类:编码字符      文章编辑:爱尚语录

  设计的字符编码。严格意义上来讲,标准ASCII码只有7位(最高位为0),共128个字符,用十进制表示是:0-127。其中0-31和127为)。它除了兼容标准的7位ASCII字符集以外,还利用高字节位扩充了一些西欧国家常用的字符和符号。尽管如此,由于ASCII码属于单字节编码(, or Single Byte Character Set),所以它最多只能表示256个字符。

  DBCS(Double Byte Character Set,双字节字符集)使用的方法。DBCS是最常见的MBCS(Multi-Byte Character Set,多字节字符集),它保留了ASCII码的128个字符(0-127),并且对一般的非拉丁字符采用双字节编码。第一个字节(前导字节,Lead Byte)使用一个大于127的数字(即高字节位为1),和第二字节(尾随字节,Trailing Byte)一起组成一个字符。所以,在DBCS里面,ASCII字符仍占1个字节,而象中文、日文等字符则占2个字节。我们常

  (Code Page, CP)。我们常说的代码页实际上是Windows为不同的字符编码方案所分配的一个数字编号。下面列举了一些常见的代码页:

  DBCS编码总是和系统的代码页联系在一起的。在不同的代码页里面,同一串数据可能会被

  成 不同的字符。比如“BA BA D7 D6 41 42 43”,在简体中文环境下(GBK,CP936),它会被映射成成“汉字ABC”;若当前代码页为繁体中文 (Big5, CP950),它就变成了“犖趼ABC”;如果选择ISO8859-1代码页的话,那我们会看到“ooó?ABC”——这就是我们常说的乱码,即没有选择正确的编码。另外当某个字符编码在当前代码页中不存在时,系统会用一个特殊的符号来显示它(方框或问号)。比如将“?2007 Google”保存为ANSI文本文件,再打开时就变成了“?2007 Google”。另外,不知道您发现了没有,对于DBCS编码的文本来说,如果其中有一个字节丢失或损坏,就可能造成整个文件出现乱码的情况。比如“字符编码(理论篇)”在内存中表示为:

  是“与”的内码(GBK),此时刚好前导字节和尾随字节都大于7F (127)。如果这时候我们把D3改成00,保存后重新打开。你猜会怎么样?它已经变得面目全非了:“.Net 胱址 嗦耄ɡ砺燮”。所以说,DBCS编码存储效率比较高,但可惜的是它包含的字符数量有限,最重要的是我们不能同时使用不同语言中的字符。

  从上面的例子可以看出,DBCS编码并不是很适合网络传输。那我们该怎么办呢?

  是语言中最小的逻辑单位,而Unicode所做的就是为每个字符分配一个唯一的数字(Code Point,字位)并定义一系列规则,并且与程序、平台以及语言无关。使用Unicode编码,我们就可以用一种统一的方式来表示和处理不同语言中的字符,而这在以前是不可能做到的。(比如,“汉字ABC????????????“)。Unicode编码仅仅兼容了ISO-8859-1标准,比如U+0041表示A,U+00A9表示?。像简体的汉字则是用U+6C49来表示的(其GBK内码是BABA)。ISO10646标准

  定义了两种Unicode字符集方案UCS(Universal Character Set):分别是UCS-2和UCS-4(2 字节编码和4字节编码)。采用UCS-4编码的字符有31位(最高位为0),理论上有0x80000000 (U-00000000-U-7FFFFFFF)个字位。整个编码空间(Code Space)分成128个组,每组有256个平面,每一平面包含256行,每行又有256个字位。其中00组的00平面(即第零平面)被称为基本多文种平面(BMP,Basic Multilingual Plane)。BMP共含有256*256=65536个字位,这么大的空间已经包含了当今世界上绝大多数常用字符(Wikipedia上有一张关于BMP如何分配的Roadmap,有兴趣的线就是对BMP中的字符进行编码,无论英文字符还是非拉丁字符,均用2个字节表示,显然UCS-2只是UCS-4的一个子集。据资料显示,现存的汉字已经超过了9万。显然对于某些专业领域来说,BMP收录的2万多汉字是远远不够用的。2000年国家为了争取主动权,开始对我国境内销售的非嵌入式软件产品强制实行

  标准。该标准除了兼容GB2312和GBK以外,还收录了CJK扩展字符集A中的6千多汉字。它同时定义了4字节编码,为我国少数民族及以后的扩展保留了大量的可用编码空间。在这样的环境下,Unicode组织推出了UTF-16

  UTF-8。接下来我们分析这几种编码有什么区别。使用系统自带的记事本和Debug工具,我们可以比较,在不同编码下将字符串汉字ABC保存到Text文件后在内存中的表示:

  我们发现,在Windows的平面文件中,每种Unicode编码都用一串字节来标识自己。我们把这串连续的字节称为BOM(Byte-order Mark,字节顺序标识)。它使用一个特殊字符U+FEFF(ZERO WIDTH NO-BREAK SPACE)来表示编码形式和字节顺序。为什么会有字节顺序呢?

  编码仍以字节作为基本编码单元,因而不会有字节顺序问题,而Unicode使用16位字(WORD)来编码,所以才会有LE和BE之分。另外从表2.1中我们可以看出UTF-8并没有字节顺序问题,使用BOM只是为了标识而已。

  “汉”字U+6C49用二进制表示是:0110 1100 0100 1001,对应U-00000800 – U-0000FFFF区间,将这些二进制位放入对应的位置后就变成了:111001101011000110001001,再将其转换成十六进制是E6 B1 89。因此我们不难算出字符串“汉字ABC”用UTF-8编码后变为“E6 B1 89 E8 AF AD 41 42 43”,这也和表2.1中的数据一致。分析完常见的几种Unicode编码格式,我们来总结一下这几种编码格式所需要的字节个数以及各自的优缺点。

  使用UTF-8编码时ASCII字符只占1个字节,存储效率比较高,适用于拉丁字符较多的场合以节省空间。

  对于大多数非拉丁字符(如中文和日文)来说,UTF-16所需存储空间最小,每个字符只占2个字节。

  Windows NT内核是Unicode(UTF-16),采用UTF-16编码在调用系统API时无需转换,处理速度也比较快。

  采用UTF-16和UTF-32会有LE和BE之分,而UTF-8则没有字节顺序问题,所以UTF-8适合传输和通信。

  UTF-32采用4字节编码,一方面处理速度比较快,但另一方面也浪费了大量空间,影响传输速度,因而很少使用

  荐:发原创得奖金,“原创奖励计划”来了!发现北京华彩瞬间,有奖征文邀你分享!

  4.将“商户单号”填入下方输入框,点击“恢复VIP特权”,等待系统校验完成即可。

  4.将“商家订单号”填入下方输入框,点击“恢复VIP特权”,等待系统校验完成即可。

本文链接:http://foungjampee.com/bianmazifu/203/