MySQL运维实战(5.1) 字符和编码的基本概念
字符和编码
字符
字符是符号,是人们用于交流的各类符号,如26个英文字母、汉字、标点符号、数学运算符、其他语言的字母和符号。
编码
编码是计算机中以二进制方式存储字符的方式。
字符集
字符集是字符和编码的映射表。如何将字符以二进制的方式存储,以及如何将二进制数据还原成人们认识的符号(字符),字符集起了关键的作用。
常见的字符集
ascii
单字节。使用00~7F,总共128个字符。
GBK
1995年12月发布的汉字编码国家标准,是对GB2312编码的扩充,对汉字采用双字节编码。
GBK字符集共收录21003个汉字,包含国家标准GB13000-1中的全部中日韩汉字,和BIG5编码中的所有汉字。
gbk编码表可以从网上找到,如:https://www.qqxiuzi.cn/zh/hanzi-gbk-bianma.php
下图是部分汉字的GBK编码:
Unicode
Unicode(统一码)是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。
Unicode的编码方式
utf8
使用变长的方式编码unicode字符。使用1-4个字节来编码。
汉字使用UTF8编码占用3个字节。
一些例子
我们可以借助Python(这里用的是python 2.7),方便地观察字符的编码和解码。
汉字“中国”的GBK编码是 D6D0 B9FA
>>> u"中国".encode('gbk') '\xd6\xd0\xb9\xfa'
汉字“中国”的UTF8编码是 E4B8AD E59BBD
>>> u"中国".encode('utf8') '\xe4\xb8\xad\xe5\x9b\xbd'
汉字“中国”的Unicode是 4E2D 56FD
>>> u"中国" u'\u4e2d\u56fd'
数据E4B8ADE59BBD以UTF8编码解码,得到汉字字符“中国”的Unicode
>>> '\xe4\xb8\xad\xe5\x9b\xbd'.decode('utf8') u'\u4e2d\u56fd'
数据E4B8ADE59BBD以GBK编码解码:
-- ADE5不是合法的GBK编码,默认情况下报错 >>> '\xe4\xb8\xad\xe5\x9b\xbd'.decode('gbk') Traceback (most recent call last): File "<stdin>", line 1, in <module> UnicodeDecodeError: 'gbk' codec can't decode bytes in position 2-3: illegal multibyte sequence -- 忽略解码时的错误,得到3个Unicode字符 >>> '\xe4\xb8\xad\xe5\x9b\xbd'.decode('gbk', errors='replace') u'\u6d93\ufffd\u6d57' -- 看起来像乱码。其中”?“是因为GBK无法解码ADE5,使用默认字符替换得来。 >>> print u'\u6d93\ufffd\u6d57' 涓�浗
产生乱码的一个原因是解码时使用的字符集不对。