-
计算机底层是二进制的机器码,那么人类的语言文字如何能"翻译"成计算的能执行的二进制呢?
-
-
后来计算机遍布全世界,中文的编码问题出现了,ASCII编码解决了英文的编码问题,英语用128个符号编码就够了,但是用来表示其他语言,128个符号是不够的(从0000000到11111111),于是中国人民搞了一个自己的编码集GBK。这样哪行,湾湾人民也不服输,搞了个BIG5编码集。这下就很麻烦了,世界上存在着多种编码方式,同一个二进制数字可以被解释成不同的符号,如果用不同的编码方式打开的话就会乱码。
-
没有一个武林盟主统一,大家自然是谁也不听谁的,如果有一种编码,将世界上所有的符号都纳入其中。每一个符号都给予一个独一无二的编码,那么乱码问题就会消失,终于一个叫ISO(国际标准化组织)的国际组织决定着手解决这个问题。他们采用的方法很简单:废了所有的地区性编码方案,重新搞一个包括了地球上所有文化、所有字母和符号的编码!他们打算叫它"Universal Multiple-Octet Coded Character Set",简称 UCS, 俗称 "UNICODE"。
-
UNICODE编码 开始制订时,计算机的存储器容量极大地发展了,空间再也不成为问题了。于是ISO就直接规定必须用两个字节(也就是16位)来统一表示所有的字符,也就是用两个字节来表示为一个字符,他总共可以组合出65535不同的字符,这大概已经可以覆盖世界上所有文化的符号,而对于ASCII里的那些"半角"字符,UNICODE包持其原编码不变,只是将其长度由原来的8位扩展为16位,而其他文化和语言的字符则全部重新统一编码。由于"半角"英文符号只需要用到低8位,所以其高8位永远是0,因此这种大气的方案在保存英文文本时会多浪费一倍的空间。
-
Unicode只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。比如,汉字"严"的unicode是十六进制数4E25,转换成二进制数足足有15位(100111000100101),也就是说这个符号的表示至少需要2个字节。表示其他更大的符号,可能需要3个字节或者4个字节,甚至更多。这里就有两个严重的问题,第一个问题是,如何才能区别Unicode和ASCII?计算机怎么知道三个字节表示一个符号,而不是分别表示三个符号呢?第二个问题是,我们已经知道,英文字母只用一个字节表示就够了,如果Unicode统一规定,每个符号用三个或四个字节表示,那么每个英文字母前都必然有二到三个字节是0,这对于存储来说是极大的浪费,文本文件的大小会因此大出二三倍,这是无法接受的。
-
UTF-8字符集
互联网的普及,强烈要求出现一种统一的编码方式。UTF-8就是在互联网上使用最广的一种Unicode的实现方式。其他实现方式还包括UTF-16(字符用两个字节或四个字节表示)和UTF-32(字符用四个字节表示),不过在互联网上基本不用。这里的关系是,UTF-8是Unicode的实现方式之一。
UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。UTF-8的编码规则很简单,只有两条:
-
对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。
-
对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。
这样既解决了乱码问题,又合理的利用了存储。
-
非字符数据的编码问题
- 对于可显示的字符,人类已经有了非常多的编码方式和字符集来对应显示,但是对于图片,视频这类非字符数据,字符集都会有乱码问题(不是所有二进制编码都有对应的可显示字符,只有二进制是字符才能正常显示),那么我们可以转为16进制,使用Base64编码进行保存。
评论