天天看点

字符编码问题ASCII、Unicode和UTF-8

1、字符编码问题的由来

    我们知道,计算机只能处理0和1组成的数字量,但你知道计算机如何表示各种数字和字符吗,你可能会机智的说,使用0和1组成的不同数字风别代表他们不就行了嘛,看来你已经get到了字符编码的核心思想了,但使用几个0和1来代表字符比较合适呢,这就涉及到了字符编码规则的问题。

2、ASCII编码

     计算机是由美国人发明的,老美首先想到的是处理自己国家的字符,英文主要有26个字母,另外加上一些乱七八糟的各种符号,差不多有127个,以后再扩展的话,撑死100个,嗯,不能再多了。而一个字节=8位,可以表示256个字符,嗯,足够用了,于是世界上第一套字符编码ascii编码出现了,他的编码规则是1个字节存放一个字符。以后读取某个文件的时候,如果知道该文件是使用ASCII编码规则来编码的,那么我们隔一个字节读取一个字符,然后按照编码规则解析出来就行了。这样老美国家的字符编码就解决了,但是坑爹的是,其他国家的字符怎么编码啊,剩下的100多个字符余量给汉字编码塞牙缝都不够啊,难道其他国家的文字就不应该出现在计算机里吗?

3、Unicode编码

    后来各国为了将自己的文字能够在计算机显示出来,制定了各自的编码规则,如中国制定了 GB2312(是两个字节的噢),日本的shift_JIS等等,各个国家都制定了自己的编码规则,但是这样又一个问题出现了,把使用GB2312编码的文件发送到日本,使用shift_JIS打开时,你绝对是一脸懵逼,全是乱码啊!机智的你立刻想到了问题的所在,傻啊,使用GB2312的文件当然用GB2312规则打开啊,但是对方怎么知道你是用什么编码规则啊,你会立刻说,在文件开头写明编码规则不就行了,但是亲,不是人人都会那么机智的,如果忘记写了,世界上就两套编码规则还好,如果有100套怎么办,一个一个试吗?这显然是不符合互联网时代“拿来即用”的规则,我们急需要一个统一的规则,包括世界上所有的编码规则,然后我们将来直接用该编码规则来解析文件就行,这时候Unicode编码横空出世了。

    Unicode(统一码、万国码、单一码)是计算机科学领域里的一项业界标准,包括字符集、编码方案等。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。(来自百度)

    虽然Unicode编码解决了字符统一的问题,但是一个新的问题又应运而生了,Unicode普遍采用2个字节进行编码,如果表示一个字母A,使用ascii编码的话只需要一个字节就够了,这样使用Unicode编码造成了存储空间的的浪费。这时候本者节约精神,UTF-8编码姗姗来迟。

4、UTF-8编码

UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。如果你要传输的文本包含大量英文字符,用UTF-8编码就能节省空间。

5、一些基本规则

    另外需要注意的是,在计算机内存中,统一使用unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码。用记事本编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符到内存里,编辑完成后,保存的时候再把Unicode转换为UTF-8保存到文件。浏览网页的时候,服务器会把动态生成的Unicode内容转换为UTF-8再传输到浏览器。

参考链接:

(1)http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431664106267f12e9bef7ee14cf6a8776a479bdec9b9000

(2)http://baike.baidu.com/link?url=T-DfVSmV1kUX7SWsUFqUtwG4_lFS7Zl-2BtjjrfXkrGlTeUQFTWeVfQL8zNEUHw3CfAgy1ikHvyiZgYXmo0upa

继续阅读