关于Unicode和多字节编码

来源:互联网 发布:js股票实时数据获取 编辑:程序博客网 时间:2024/05/17 09:40

以前写代码的时候vs总是把main函数写成_tmain以前也不深究,最近忽然好奇为什么这么写,查了下知道_tmain是为了支持Unicode编码方式的main函数,那么什么是Unicode,Unicode之外的编码又是什么编码呢?


Unicode之外的编码


在谈这个之前要先说一下,为什么要编码。

ASCII编码


我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串。每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte)。也就是说,一个字节一共可以用来表示256种不同的状态,每一个状态对应一个符号,就是256个符号,从0000000到11111111。
上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系(这也是为什么会出现多字节编码),做了统一规定。这被称为ASCII码,一直沿用至今。
ASCII码一共规定了128个字符的编码,比如空格"SPACE"是32(二进制00100000),大写的字母A是65(二进制01000001)。这128个符号(包括32个不能打印出来的控制符号),只占用了一个字节的后面7位,最前面的1位统一规定为0。


非ASCII编码


对于英语来说一个字节8位的编码是完全够用的,但是对于其他语言,仅用一个字节中后7位是不够的,因此有些国家就将没有利用的第一位利用起来,这样的话,同一个编码比如122对于不同国家来说对应的字符是不一样的。同时,对于汉语来说一个字节的编码对于汉语来说明显是不够的。因此就出现了大于一个字节,即多字节的编码。对于亚洲文字,出现了很多编码方式,简体中文常见的编码方式是GB2312,使用两个字节表示一个汉字,理论上可以表示256*256 =65536个符号,对于我们常用的汉字与符号是够用了。

但这样也会带来一个问题:各个国家都用自己的编码,编写的代码是没法在各个国家通用的。因此需要一个全球统一的文字编码方式——Unicode。

Unicode


Unicode为每一个符号都给予独一无二的编码,那么乱码的问题就解决了。但是Unicode也有一个问题,英文字母的编码最多占用7位,而汉字的编码可能占据2个字节,甚至更多。如果规定Unicode的长度一定是3个字节或者4个字节,那么字母的编码前边几个字节都会是0,这对于存储来说是很大的浪费。文本文件的大小也会比以前的多字节编码多很多。因此就出现了Unicode的各个版本,比如说UTF-8,UTF-16,具体细节就不多说了。

回归最初讨论的问题,windows为什么要用tmain,为什么还要支持多字节编码,我的理解是中国对于汉字有自己的很多种编码,而windows要进入中国市场就要遵守中国的编码规则,与国内的诸多软件可以兼容使用,同时保证使用舒适度。而linux为什么就没有这个问题,我觉得是因为linux没必要迁就各国的多字节编码,因为它本来就是免费的,因此会采用Unicode编码。这也就是为什么在windows上可以用的代码,在linux上会出现乱码的情况。

0 0
原创粉丝点击