目录
基础知识
计算机中储存的信息都是用二进制数表示的;而我们在屏幕上看到的英文、汉字等字符是二进制数转换之后的结果。
通俗的说,按照何种规则将字符存储在计算机中,如'a'用什么表示,称为"编码";反之,将存储在计算机中的二进制数解析显示出来,
称为"解码",如同密码学中的加密和解密。在解码过程中,如果使用了错误的解码规则,则导致'a'解析成'b'或者乱码
字符集(Charset):
是一个系统支持的所有抽象字符的集合。字符是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。
这里的系统可以理解为一个文字系统
字符编码(Character Encoding):
规定了怎样的二进制数标识什么字符:例如ascii字符集中把字符a
编码为97
常见字符集名称:
ASCII字符集、GB2312字符集、BIG5字符集、GB18030字符集、Unicode字符集
ASCII码
C英文字符对应的编码就是ascii码
Unicode
Unicode意为统一码万国码,想要将所有的码都用唯一字符表示出来
Unicode的问题
unicode规定了符号的二进制代码,比如说unicode是包含着ascii字符集,
a仍是97编码,但是,整个字符集包含了100多万的字符,所以用何种方式来储存unicode编码就成了问题
如果统一3字节储存,2^24=1600万大抵是够了
那么英文用户第一个不乐意,平时一个字节就能存完但是用了unicode就要翻三倍,所以变长的字符存储方式出现了
utf8
utf8实际上是一种用变长的编码表示unicode字符集的方案
具体的编码方式很简单,只有两条
- 对于单字节的符号:字节的第一位设为0,后面7位为这个符号的 Unicode 码。因此对于英语字母,UTF-8 编码和 ASCII 码是相同的;
- 对于n字节的符号(n > 1):第一个字节的前n位都设为1,第n + 1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的 Unicode 码。
下面,还是以汉字严为例,演示如何实现 UTF-8 编码。
严的 Unicode 是4E25(100111000100101),根据上表,可以发现4E25处在第三行的范围内(0000 0800 - 0000 FFFF),
因此严的 UTF-8 编码需要三个字节,即格式是1110xxxx 10xxxxxx 10xxxxxx。然后,从严的最后一个二进制位开始,
依次从后向前填入格式中的x,多出的位补0。这样就得到了,严的 UTF-8 编码是11100100 10111000 10100101,转换成十六进制就是E4B8A5。
GB2312是什么
为了显示中文字符GB2312规定如果一个字节的数据小于127,那么就是ascii码,和原来的意思相同
但如果>127就是两个字节相连形成的gb2312中规定的中文字符
前面的一个字节(称之为高字节)从0xA1用到 0xF7,后面一个字节(低字节)从0xA1到0xFE
这样能够凑出7000多个汉字在这些编码里,还把数学符号、罗马希腊的 字母、日文的假名们都编进去了,
连在ASCII里本来就有的数字、标点、字母都统统重新编了两个字节长的编码,这就是常说的"全角"字符,
而原来在127号以下的那些就叫"半角"字符了。