编码
ascii
最基础的字符编码集,以8bit字节为单位存储,0-127 无需多说。
ISO-8859-1字符集
也叫Latin-1, ascii的扩展,同样以8bit字节为单位存储,0-255
GB2312
中文国标字符集,它的第一个字节为128-255。系统可以据此判断,若第一个字节大于127,则把与该字节后紧接着的一个字节结合起来共两个字节组成一个中文字符。
在GB2312字符集中,ASCII字符仍然用一个字节存储,换句话说该ASCII是该字符集的子集。那么同时就可以得出,GB2312不是定长的。
GB2312只包含数千个常用汉字,只能表示简体字
GBK
GB2312的扩展,保持和GB2312兼容外,还包含繁体中文字,日文字符和朝鲜字符。
GBK是现阶段Windows及其他一些中文操作系统的缺省字符集
GB18030-2000
国家标准中文字符集,比GBK包含字符更多的字符集
unicode
这是最统一的编码,可以用来表示所有语言的字符,而且是定长双字节(也有四字节的)编码,Unicode的学名是"Universal Multiple-Octet Coded Character Set",简称为UCS。UCS可以看作是"Unicode Character Set"的缩写。
UTF
考虑到unicode编码不兼容iso8859-1编码,而且容易占用更多的空间:因为对于英文字母,unicode也需要两个字节来表示。所以unicode不便于传输和存储。因此而产生了utf编码,utf编码兼容iso8859-1编码,同时也可以用来表示所有语言的字符,不过,utf编码是不定长编码,每一个字符的长度从1-6个字节不等。另外,utf编码自带简单的校验功能。一般来讲,英文字母都是用一个字节表示,而汉字使用三个字节。
一种针对Unicode的可变长度字符编码,也是一种前缀码。可以用来表示Unicode标准中的任何字符,且其编码中的第一个字节仍与ASCII兼容。UTF是“UCS Transformation Format”的缩写
UTF-8使用1~4个字节为每个字符编码:
1.128个US-ASCII字符只需一个字节编码(Unicode范围为U+0000~U+007F);
2.带有附加符号的拉丁文、希腊文、西里尔字母、亚美尼亚语、希伯来文、阿拉伯文、叙利亚文及它拿字母则需要两个字节(Unicode范围U+0080~U+07FF);
3.其他多文种平面中的字符使用三个字节编码(例如中文,因为Unicode BMP字符编码值映射中中文字符占用了15位到16位,后面详细介绍);
4.其他极少使用的Unicode辅助平面的字符使用四字节编码。
UCS只是规定如何编码,并没有规定如何传输、保存这个编码。例如“汉”字的UCS编码是6C49,我可以用4个ascii数字来传输、保存这个编码;也可以用utf-8编码:3个连续的字节E6 B1 89来表示它。关键在于通信双方都要认可。UTF-8、UTF-7、UTF-16都是被广泛接受的方案。UTF-8的一个特别的好处是它与ISO-8859-1完全兼容。UTF是“UCS Transformation Format”的缩写。
Little endian和Big endian
Unicode码可以采用UCS-2格式直接存储。以汉字”严“为例,Unicode码是4E25,需要用两个字节存储,一个字节是4E,另一个字节是25。存储的时候,4E在前,25在后,就是Big endian方式;25在前,4E在后,就是Little endian方式。
这两个古怪的名称来自英国作家斯威夫特的《格列佛游记》。在该书中,小人国里爆发了内战,战争起因是人们争论,吃鸡蛋时究竟是从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开。为了这件事情,前后爆发了六次战争,一个皇帝送了命,另一个皇帝丢了王位。
因此,第一个字节在前,就是”大头方式“(Big endian),第二个字节在前就是”小头方式“(Little endian)。
那么很自然的,就会出现一个问题:计算机怎么知道某一个文件到底采用哪一种方式编码?
Unicode规范中定义,每一个文件的最前面分别加入一个表示编码顺序的字符,这个字符的名字叫做”零宽度非换行空格“(ZERO WIDTH NO-BREAK SPACE),用FEFF表示。这正好是两个字节,而且FF比FE大1。
如果一个文本文件的头两个字节是FE FF,就表示该文件采用大头方式;如果头两个字节是FF FE,就表示该文件采用小头方式。