上文大概对acsii码和ansi编码做了简要的介绍,并在文章最后把后者和unicode做了一个简单的对比,这个对比也暗示了本文的主题。
大概总结一下我们已经知道的: 每个国家或民族都有对计算机的需求,存储或传播各自的文化。各个国家都像中国这样搞出一套自己的编码标准,结果互相之间谁也不懂谁的编码,谁也不支持别人的编码,连大陆和台湾这样只相隔了150海里,使用着同一种语言的兄弟地区,也分别采用了不同的 DBCS 编码(双字节编码)方案——当时的中国人想让电脑显示汉字,就必须装上一个"汉字系统",专门用来处理汉字的显示、输入的问题。如果那天你想用台湾的某一个中文软件,就要安装BIG5的编码,或软件自身携带转换功能。另一个就是程序员对“国际代码”的需求,就是说程序员A编写了一套含有中文的软件,而远在日本的某个程序员B想读代码或运行此软件,如果是在自己的ansi编码,当然就显示乱码了。B就要安装一个中文字符系统才能正确显示中文。
——————————我是分割线———————————
好了,说了这么多,Unicode该出场了,它出现的目的就是解决各种或各个国家的编码系统给通讯交流、国际代码和网页显示带来的障碍。它俗称统一码、万国码和标准万国码,真真是个世界级的标准,废除了所有的地区性编码方案,把全球的所有字母、文字和各种符号都包含进来,就是说它对世界上大部分的文字系统进行了整理、编码。Unicode用数字0-0x10FFFF来映射这些字符,最多可以容纳1114112个字符,或者说有1114112个码位。码位就是可以分配给字符的数字,采用二个字节编码,与ANSI码不兼容。UFT-8、UTF-16、UTF-32都是将数字转换到程序数据的编码方案。
因为Unicode存储的任何字符都占用2个字节的空间,所以在解码的时候就两个字节两个字节地取。如果发现高八位不是00,则认为这两个字节表示一个非ASCII字符(一个字节就可以解决之),反之如果发现高八位为00,则可知,该字符为ASCII字符,于是取出低八位,再根据ASCII码表查到对应字符,因为取出的低八位认为表示的是一个ASCII字符,所以字符空间为2的8次方,也就是256个,因此采用Unicode编码表式的ASCII字符属于扩展的ASCII字符集,只是这种扩展是世界级的扩展。
Unicode只有一个字符集,中、日、韩的三种文字占用了Unicode中0x3000到0x9FFF的部分 。Unicode目前普遍采用的是UCS-2,它用两个字节来编码一个字符, 比如汉字"经"的编码是0x7ECF,注意字符编码一般用十六进制来 表示,为了与十进制区分,十六进制以0x开头,0x7ECF转换成十进制 就是32463,UCS-2用两个字节来编码字符,两个字节就是16位二进制, 2的16次方等于65536,所以UCS-2最多能编码65536个字符。 编码从0到127的字符与ASCII编码的字符一样,比如字母"a"的Unicode 编码是0x0061,十进制是97,而"a"的ASCII编码是0x61,十进制也是97, 对于汉字的编码,事实上Unicode对汉字支持不怎么好,这也是没办法的, 简体和繁体总共有六七万个汉字,而UCS-2最多能表示65536个,才六万多个,所以Unicode只能排除一些几乎不用的汉字,好在常用的简体汉字 也不过七千多个,为了能表示所有汉字,Unicode也有UCS-4规范,就是用 4个字节来编码字符,不过现在普遍采用的还是UCS-2,只用两个字节来 编码。大家也许发现了,如果只有英文的文档也用unicode来编码岂不是浪费了一半空间么?是的,如果互联网上的信息都转为unicode编码或存储,空间占用会大一倍。有什么办法解决这个问题呢,也就是按需分配的问题。
大概总结一下我们已经知道的: 每个国家或民族都有对计算机的需求,存储或传播各自的文化。各个国家都像中国这样搞出一套自己的编码标准,结果互相之间谁也不懂谁的编码,谁也不支持别人的编码,连大陆和台湾这样只相隔了150海里,使用着同一种语言的兄弟地区,也分别采用了不同的 DBCS 编码(双字节编码)方案——当时的中国人想让电脑显示汉字,就必须装上一个"汉字系统",专门用来处理汉字的显示、输入的问题。如果那天你想用台湾的某一个中文软件,就要安装BIG5的编码,或软件自身携带转换功能。另一个就是程序员对“国际代码”的需求,就是说程序员A编写了一套含有中文的软件,而远在日本的某个程序员B想读代码或运行此软件,如果是在自己的ansi编码,当然就显示乱码了。B就要安装一个中文字符系统才能正确显示中文。
——————————我是分割线———————————
好了,说了这么多,Unicode该出场了,它出现的目的就是解决各种或各个国家的编码系统给通讯交流、国际代码和网页显示带来的障碍。它俗称统一码、万国码和标准万国码,真真是个世界级的标准,废除了所有的地区性编码方案,把全球的所有字母、文字和各种符号都包含进来,就是说它对世界上大部分的文字系统进行了整理、编码。Unicode用数字0-0x10FFFF来映射这些字符,最多可以容纳1114112个字符,或者说有1114112个码位。码位就是可以分配给字符的数字,采用二个字节编码,与ANSI码不兼容。UFT-8、UTF-16、UTF-32都是将数字转换到程序数据的编码方案。
因为Unicode存储的任何字符都占用2个字节的空间,所以在解码的时候就两个字节两个字节地取。如果发现高八位不是00,则认为这两个字节表示一个非ASCII字符(一个字节就可以解决之),反之如果发现高八位为00,则可知,该字符为ASCII字符,于是取出低八位,再根据ASCII码表查到对应字符,因为取出的低八位认为表示的是一个ASCII字符,所以字符空间为2的8次方,也就是256个,因此采用Unicode编码表式的ASCII字符属于扩展的ASCII字符集,只是这种扩展是世界级的扩展。
Unicode只有一个字符集,中、日、韩的三种文字占用了Unicode中0x3000到0x9FFF的部分 。Unicode目前普遍采用的是UCS-2,它用两个字节来编码一个字符, 比如汉字"经"的编码是0x7ECF,注意字符编码一般用十六进制来 表示,为了与十进制区分,十六进制以0x开头,0x7ECF转换成十进制 就是32463,UCS-2用两个字节来编码字符,两个字节就是16位二进制, 2的16次方等于65536,所以UCS-2最多能编码65536个字符。 编码从0到127的字符与ASCII编码的字符一样,比如字母"a"的Unicode 编码是0x0061,十进制是97,而"a"的ASCII编码是0x61,十进制也是97, 对于汉字的编码,事实上Unicode对汉字支持不怎么好,这也是没办法的, 简体和繁体总共有六七万个汉字,而UCS-2最多能表示65536个,才六万多个,所以Unicode只能排除一些几乎不用的汉字,好在常用的简体汉字 也不过七千多个,为了能表示所有汉字,Unicode也有UCS-4规范,就是用 4个字节来编码字符,不过现在普遍采用的还是UCS-2,只用两个字节来 编码。大家也许发现了,如果只有英文的文档也用unicode来编码岂不是浪费了一半空间么?是的,如果互联网上的信息都转为unicode编码或存储,空间占用会大一倍。有什么办法解决这个问题呢,也就是按需分配的问题。