字符编码
如何显示一个字符
需要:
- 字符集
- 字符编码
- 字体
字符集
Unicode
统一码联盟,他们由Xerox、Apple等软件制造商于1988年组成,并且开发了Unicode标准。
USC
国际标准化组织(ISO),他们于1984年创建ISO/IEC JTC1/SC2/WG2工作组,试图制定一份“通用字符集”(Universal Character Set,简称UCS),并最终制定了ISO 10646标准。
其他
ASCII、GB2312等也是字符集,但是它们的码值与在计算机中存储的字节码相同,就直接在字符编码中介绍了。
字符编码
- MDN:一套编码系统定义字节与文本间的映射。
- 维基百科:把字符集中的字,编码为指定集合中某一对象(例如:比特模式、自然数序列、8位组或者电脉冲),以便文本在计算机中存储和通过通信网络的传递。
- 狗蛋儿:人将字符集合与字节码一一映射后得到的字符表,可以从这个表中通过字节码获得对应的字符。
ASCII
主要包括控制字符(回车键、退格、换行键等);可显示字符(英文大小写字符、阿拉伯数字和西文符号)。
- 字节数:单字节
- 字符数:128
- 规则:
0
到0x7F
GB2312
GB2312,又称为GB0,由中国国家标准总局发布,1981年5月1日实施。GB2312是中国国家标准的简体中文字符集。它所收录的汉字已经覆盖99.75%的使用频率,基本满足了汉字的计算机处理需要。在中国大陆和新加坡获广泛使用。
- 字节数:双字节
- 字符数:6763
- 规则:
第一个(高)字节的范围:0xA1
到0xFE
,共94
,设定为94个区
第二个(低)字节的范围:0xA2
到0xFF
,共94
,与第一个字节组合,即表示每个区有94个字符
GBK
GBK 向下与 GB 2312 完全兼容,向上支持 ISO 10646 国际标准,在前者向后者过渡过程中起到的承上启下的作用。
- 字节数:双字节
- 字符数:21886
- 规则:
第一个字节的值从0x81
到0xFE
第二个字节的值从0x40
到0xFE
(不包括0x7F
)
GB18030
国家标准 GB 18030-2005《信息技术中文编码字符集》,是中华人民共和国现时最新的内码字集,是 GB 18030-2000《信息技术信息交换用汉字编码字符集基本集的扩充》的修订版。
- 字节数:多字节,单、双、四
- 字符数:70244
- 规则:
- 单字节
0
到0x7F
,与 ASCII 编码兼容- 双字节
第一个字节的值从0x81
到0xFE
第二个字节的值从0x40
到0xFE
(不包括0x7F
),与 GBK 标准兼容
- 双字节
- 四字节
第一个字节的值从0x81
到0xFE
第二个字节的值从0x30
到0x39
第三个字节从0x81
到0xFE
第四个字节从0x30
到0x39
- 单字节
UTF-8
为了解决使用 Unicode 时,英文字符空白字节占位多,造成浪费问题。对于单字节的符号,字节的第一位设为0,后面7位为这个符号的 Unicode 码。因此对于英语字母,UTF-8 编码和 ASCII 码是相同的。对于n字节的符号(n > 1),第一个字节的前n位都设为1,第n + 1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的 Unicode 码。
- 字节数:单、三、四
- 规则:
Unicode符号范围(十六进制) UTF-8编码方式(二进制) 0000 0000 - 0000 007F 0xxxxxxx 0000 0080 - 0000 07FF 110xxxxx 10xxxxxx 0000 0800 - 0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx 0001 0000 - 0010 FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
USC-2
可以为全世界最常用的63K字符编码。
- 字节数:双
- 规则:
0 到0xFFFF
,不包括(0xD800
到0xDFFF
)
UTF-16
两个字节时可为全世界最常用的63K字符编码,与UCS-2一样;四个字节对不常用的字符进行编码。
- 字节数:双、四
- 规则:
- 双字节
0 到0xFFFF
,不包括(0xD800
到0xDFFF
) - 四字节
- U+10000 ~ U+10FFFF 的码值,用字节表示,即
0x10000
到0x10FFFF
,设为变量x
y
=x
-0x10000
,y
的范围是0
到0xFFFFF
- 将
y
前后分为两个 10bit 的十六进制数,y1
,y2
z1
=0xD800
+y1
,z2
=0xDC00
+y2
z1``z2
是所需表示的unicode的编码值
- U+10000 ~ U+10FFFF 的码值,用字节表示,即
- 双字节
USC-4 和 UTF-32
- 字节数:四
- 规则:
- USC-4
理论上0
到0x7FFFFFFF
,实际上只有0
到0x10FFFF
- UTF-32
0
到0x10FFFF
,算 USC-4 的子集
- USC-4
使用了错误的编码
当对文件使用了非本身的编码来解析,会出现:
- 乱码
不同的编码中,相同的字节会映射成不同的字符 - 文件大小改变
比如在js中,使用 UTF-8 来读取非 UTF-8 编码的文件,遇到不符合规则的字节,程序尝试解析成一个 UTF-8 的字符,再将数据写入文件,这样一个字节就可能会变成三个字节