之前写过一篇介绍字符和编码的文章:<程序中的字符和编码> http://blog.csdn.net/cc_net/archive/2008/09/07/2896317.aspx,主要是从理论上介绍了,当时对于unicode介绍的比较简单,而在c#中用的很多,写程序经常碰到编码问题,所以这次主要介绍一下编码规则。

 

 

 一 编码和编码规则

 

这是一个比较不好理解的东西。我们都知道计算机只认识2进制的数字0和1,任何字符在电脑中都是以2进制的形式存储的。把字符转换为计算机认识的过程就叫做编码,经过编码的字符才能被计算机处理,这时经过编码后的字符称之为【内码】。从前面一篇文章可以看到字符编码经历了ASCII、ANSI、UNICODE这几个阶段。所以字符编码就是指定文字和内码之间转换的一种规则,更简单的可以理解为用几个字节去标识字符。而所以编码规则就是,字符在字节中的存储方式。 这个就好比邮政编码,有的国家是6位数,有的是5为数标识。对于6位数,那一位是表示省,那一个是表示市这是需要规定的,这也就是所以的编码规则。

 

 

二 BOM

 

 

在介绍UNICODE编码规则之前,需要先介绍一个概念,BOM——Byte Order Mark,就是字节序标记。因为USC-2和USC-4都是用多个字节来表示一个字符,所以就存在一个表示顺序的问题。是字节1+字节2表示,还是字节2+字节1来表示一个字符。

在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。

看了上面的介绍,我们就可以在UNICODE编码前加上一个BOM,就可以知道用那一种方法解码字符。

 

继续阅读