首页 > 代码库 > unicode与ascii的那些事
unicode与ascii的那些事
ASCII码的由来
计算机发明后,为了在计算机中表示字符,人们制定了一种编码,叫ASCII码。ASCII码由一个字节中的7位(bit)表示,范围是0x00 - 0x7F 共128个字符。
后来他们突然发现,如果需要按照表格方式打印这些字符的时候,缺少了“制表符”。于是又扩展了ASCII的定义,使用一个字节的全部8位(bit)来表示字符了,这就叫扩展ASCII码。范围是0x00 - 0xFF 共256个字符。
Unicode详细介绍
1.容易产生后歧义的两字节
unicode的第一个版本是用两个字节(16bit)来表示所有字符。实际上这么说容易让人产生歧义,我们总觉得两个字节就代表保存在计算机中时是两个字节。于是任何字符如果用unicode表示的话保存下来都占两个字节,其实这种说法是错误的。
其实Unicode涉及到两个步骤,首先是定义一个规范,给所有的字符指定一个唯一对应的数字,这完全是数学问题,可以说跟计算机没关系。第二步才是怎么把字符对应的数字保存在计算机中,这才涉及到实际在计算机中占多少字节空间。
所以我们也可以这样理解,Unicode是用0至65535之间的数字来表示所有字符。其中0至127这128个数字表示的字符仍然跟ASCII完全一样。65536是2的16次方,这是第一步。第二步就是怎么把0至65535这些数字转化成01串保存到计算机中,这肯定就有不同的保存方式了。于是出现了UTF(unicode transformation format),有UTF-8,UTF-16。
2.UTF-8 与UTF-16的区别
UTF-16比较好理解,就是任何字符对应的数字都用两个字节来保存。我们通常对Unicode的误解就是把Unicode与UTF-16等同了,但是很显然如果都是英文字母这做有点浪费,明明用一个字节能表示一个字符为啥整两个啊。
于是又有个UTF-8,这里的8非常容易误导人,8不是指一个字节。难道一个字节表示一个字符?实际上不是,当用UTF-8时表示一个字符是可变的,有可能是用一个字节表示一个字符,也可能是两个,最多三个。也就是说UTF-8能用1~3字节表示字符,而实际大小是可动态变化,根据字符对应的数字大小来确定
于是UTF-8和UTF-16的优劣很容易就看出来了。如果全部英文或英文与其他文字混合,但英文占绝大部分,用UTF-8就比UTF-16节省了很多空间。而如果全部是中文这样类似的字符或者混合字符中中文占绝大多数。UTF-16就占优势了,可以节省很多空间,当然还有个容错问题。
举个例子,假如中文字"汉"对应的unicode是6C49(这是用十六进制表示,用十进制表示是27721为啥不用十进制表示呢?很明显用十六进制表示要短点.其实都是等价的没啥不一样,就跟你说60分钟和1小时一样。你可能会问当用程序打开一个文件时我们怎么知道那是用的UTF-8还是UTF-16呢?自然会有点啥标志,在文件的开头几个字节就是标志。
EF BB BF 表示UTF-8
FE FF 表示UTF-16。
unicode与ascii的那些事