现在的位置: 首页 > 综合 > 正文

Unicode 和 UTF-8

2014年01月07日 ⁄ 综合 ⁄ 共 1629字 ⁄ 字号 评论关闭

Unicode 和 UTF-8

经过不懈的努力,看了一些文章,也自己亲手尝试了一下,终于把这个问题弄清楚了。虽然我想已经有不止一个人写过这种内容,或者相信很多人都已经十分清楚了,我还是把我的经历和体会简单的写一写,就不要笑话了。
 
以前就知道Unicode,他的意义我想大多数人也都很清楚,就是为了使得我们在编码的问题上有一个通用的解决方案,所以现今的很多体系都开始使用Unicode作为默认的编码方式,如Java里的字符,以及XML等都是使用Unicode为标准的。同时,如果我们留心的话,UTF-8也时常会出现在我们的视野中,而且似乎他们之间有着微妙的关系,而伴随着出现。
 
曾经一段时间我认为UTF-8和UTF-16都只是某种Unicode的编码方式,我们也都说Unicode是双字节的,而最近的一些谈论中,我们又常说这个是UTF-8的,另外一个是Unicode的,于是乎我就郁闷了,决定一定要弄清楚。从一些文档和资料上,我们可以看到一些相关的内容,如在.Net的Encoding类中,就有如下的静态成员,他们都是用来完成编码工作的。
ASCII: Gets an encoding for the ASCII (7-bit) character set.
BigEndianUnicode: Gets an encoding for the UTF-16 format using the big-endian byte order.
Unicode: Gets an encoding for the UTF-16 format using the little-endian byte order.
UTF32: Gets an encoding for the UTF-32 format using the little-endian byte order.
UTF7: Gets an encoding for the UTF-7 format.
UTF8: Gets an encoding for the UTF-8 format.
看明白了吗?这里的Unicode使用的是UTF-16的编码方式,换句话说,UTF-8、UTF-7、UTF-16都是Unicode的编码方式,而Unicode本身只是一种对字符的规定,可以理解为“编号”,并不会受到任何的限制,甚至超过65536的双字节限制,比如0x1D11E也是一个Unicode字符,而他显然不可以用两个字节表示。那Unicode究竟是不是双字节的呢?实际上我们通常只是把Unicode当作UTF-16的代名词了,因为绝大大多数的时候的字符都在UTF-16双字节的表示范围内,此时存储的数值和Unicode的“编号”是完全一致的,自然我们就把Unicode理解成双字节的了。
 
因此无论是UTF-8还是UTF-16都只是对Unicode“编号”的一种存储方式,他们以不同的单元对Unicode“编号”进行编码存储。如UTF-8以8位为单位存储Unicode字符,对于不同的Unicode字符,其存储空间可能是1~4个字节。而UTF-16则以16位为一个单元,其存储空间可能是2或者4个字节。这样就大致明白了!
 
意外的是,我们可以发现现在的Notepad或者UltraEdit在存储文本文件的时候,都有一个编码的选项。在Notepad中有Unicode和UTF-8,而在UltraEdit中确有Unicode、UTF-16和UTF-8。不过刚刚我们认为Unicode通常意义上是UTF-16的代名词吗?怎么回事呢?尝试了一下之后,终于真相大白。Notepad中的是和我们的理解一致的,Unicode指的是UTF-16的编码,而UltraEdit中的Unicode则不是。UltraEdit中的Unicode在存储字符的时候是以字符的形式把“/U1D1B”这样的“编号”存储起来的,换句话说是6个ASCII字符,如果使用Notepad打开,你看到的就是原始的Unicode字符“编号”了,相信你无法识别出原来的字符是什么了,呵呵!

 

抱歉!评论已关闭.