字符编码,这一路走来~

ASCII(American Standard Code for Information Interchange)

The American Standard Code for Information Interchange (ASCII /ˈæski/ ass-kee) is a character-encoding scheme originally based on the English alphabet that encodes 128 specified characters - the numbers 0-9, the letters a-z and A-Z, some basic punctuation symbols, some control codes that originated with Teletype machines, and a blank space - into the 7-bit binary integers.

美国标准协会X3.2委员会基于早期的电传打字机设计了ASCII码,他们将128个特定字符(数字0-9,字母a-zA-Z,一些基本的标点符号,一些控制代码,空格)编码成为7位二进制整数,只占用一个字节的后面7位,最前面的1位规定为0,也称为ANSIASCII编码。

后来,由于其他国家的字母里有很多字符是ASCII没有的,于是他们采用127位之后的空位来表示这些新的字符,一直把序号编到了最后一个状态255。欧洲国家使用的ASCII编码体系,可以表示最多256个符号。从128255这一页的字符集称为“扩展字符集”。

无论是ANSIASCII编码,还是扩展后的ASCII编码,都是一个字节表示一个字符。

GB2312

中国用于简体中文的官方字符集,是对ASCII的中文扩展。 GB abbreviates Guojia Biaozhun (国家标准)。不同国家和地区使用两个字节代表一个字符的各种汉字延伸编码方式成为ANSI编码。

规定:一个小于127的字符的意义与原来相同,但两个大于127的字符连在一起时,就表示一个汉字,前面的一个字节(他称之为高字节)从0xA1用到 0xF7,后面一个字节(低字节)从0xA10xFE,这样我们就可以组合出大约7000多个简体汉字了。在这些编码里,我们还把数学符号、罗马希腊的字母、日文的假名们都编进去了,连在ASCII里本来就有的数字、标点、字母都统统重新编了两个字节长的编码,这就是常说的“全角”字符,而原来在127号以下的那些就叫“半角”字符了。

GBK

         K代表扩展。只要第一个字节是大于127就固定表示这是一个汉字的开始,不管后面跟的是不是扩展字符集里的内容。结果扩展之后的编码方案被称为GBK标准,GBK包括了GB2312的所有内容,同时又增加了近20000个新的汉字(包括繁体字)和符号。再增加几千个新的少数民族的字,GBK扩展成为GB18030

这一系列汉字编码的标准被称为DBCSDouble Byte Character Set)双字节字符集,最大的特点是两字节长的汉字字符和一字节长的英文字符并存于同一套编码方案里,必须要注意字串里的每一个字节的值,如果这个值是大于127的,那么就认为一个双字节字符集里的字符出现了。

Unicode

为了将世界上所有符号都纳入其中,是一种所有符号的编码。ISO国际标准化组织规定必须用两个字节统一表示所有的字符,这种方案将ANSIASCII编码长度由原来的8位扩展为16位,在保存英文文本时会多浪费一倍空间。

UTF-8(UCS Transfer Format)

UTF-8Unicode的实现方式之一,每次8个位传输数据。UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。

UTF-8的编码规则很简单,只有二条:

1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。

2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码,从后往前顺序填充Unicode码,多余的位补0

UCS (Universal Character Set)

BOM(byte-order mark字节顺序标记)

为了识别 Unicode 文件,Microsoft建议所有的Unicode文件应该以零宽无间断间隔ZERO WIDTH NOBREAK SPACEU+FEFF)的字符开头。这作为一个“特征符”或“字节顺序标记(byte-order markBOM)”来识别文件中使用的编码和字节顺序。FFFEUCS中是不存在的字符,所以不应该出现在实际传输中。UCS规范建议我们在传输字节流前,先传输字符"Zero Width No-Break Space"。这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little- Endian的。

    存储地址内的排列则有两个通用规则。一个多位的整数将按照其存储地址的最低或最高字节排列。如果最低有效字节在最高有效字节的前面,则称小端序;反之则称大端序。

PS: iconv - program and standardized API to convert encodingsiconv是一个计算机程序以及一套应用程序编程接口的名称。它的作用是在多种国际编码格式之间进行文本内码的转换。

你可能感兴趣的:(character,字符编码,encoding)