很明显,我们平时在使用计算机时,用的都是人类能读懂的字符(用高级语言编程的结果也无非是在文件内写了一堆字符),如何能让计算机读懂人类的字符?
必须经过一个过程:
字符--------(翻译过程)------->数字
这个过程实际就是一个字符如何对应一个特定数字的标准,这个标准称之为字符编码。
字符编码种类:
ASCII:一个Bytes代表一个字符(英文字符/键盘上的所有其他字符),1Bytes=8bit,8bit可以表示0-2**8-1种变化,即可以表示256个字符
ASCII最初只用了后七位,127个数字,已经完全能够代表键盘上所有的字符了(英文字符/键盘的所有其他字符)
后来为了将拉丁文也编码进了ASCII表,将最高位也占用了
GBK:为了满足中文,中国人定制了GBK 。GBK:2Bytes代表一个中文字符,1Bytes表示一个英文字符。为了满足其他国家,各个国家纷纷定制了自己的编码 。
日本把日文编到Shift_JIS里,韩国把韩文编到Euc-kr里。
Unicode:各国有各国的标准,就会不可避免地出现冲突,结果就是,在多语言混合的文本中,显示出来会有乱码。
于是产生了unicode(定长),统一用2Bytes代表一个字符,虽然2**16-1=65535,但unicode却可以存放100w+个字符,因为unicode存放了与其他编码的映射关系,准确地说unicode并不是一种严格意义上的字符串编码表.而是映射表。
UTF-8:于是产生了UTF-8(可变长),对英文字符只用1Bytes表示,对中文字符用3Bytes,对其他生僻字用更多的字节Bytes去存。
需要强调的是:
毫无疑问utf-8比unicode更节省空间,而且都能兼容万国,那为何不全部采用utf-8呢?
其一:如果我们能统一全世界,废除所有现有的计算机编码体系,然后大一统都采用utf-8,那么乱码问题将不复存在,很明显很多地方仍会采用各种各样的编码,这是历史遗留问题。因而我们必须寻求一种与全世界的编码都有映射关系的解决方案,这就是unicode,而utf8是没有与其他编码的映射关系的。
其二:内存中统一采用unicode,浪费空间来换取可以转换成任意编码(不乱码),硬盘可以采用各种编码,如utf-8,保证存放于硬盘或者基于网络传输的数据量很小,提高传输效率与稳定性。
原文地址:http://11368245.blog.51cto.com/11358245/1965696