您的当前位置:首页字符集(乱码)

字符集(乱码)

2024-06-22 来源:爱问旅游网


国标GB

GB2312

GB2312 是对 ASCII 的中文扩展,在保留原ASCII前127个字符的基础上用两个字节(16位)表示一个汉字,分别叫高字节(0xA1~0xF7)和低字节(0xA1~0xFE)。而且又把原ASCII的127个字符用双字节重新编码了一次,即我们所说的全角字符。

如:“测” 的编码是B2E2

“测试”的编码是B2E2 CAD4

如:(半角)“A” 的编码是0X41(十进制:65),和ASCII中的编码一致,占一个字节;

(全角)“A”的编码是0XA3C1(二进制:10100011 11000001),占两个字节;

“联通”乱码

当你在 windows 的记事本里新建一个文件,输入\"联通\"两个字之后,保存,关闭,然后再次打开,你会发现这两个字已经消失了,代之的是几个乱码,有人说这就是联通之所以拼不过移动的原因。 其实这是因为GB2312编码与UTF8编码产生了编码冲撞的原因。

从UNICODE到UTF8的转换规则:

Unicode UTF-8

0000 - 007F 0xxxxxxx

0080 - 07FF 110xxxxx 10xxxxxx

0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx

例如\"汉\"字的Unicode编码是6C49。6C49在0800-FFFF之间,所以要用3字节模板:1110xxxx 10xxxxxx 10xxxxxx。将6C49写成二进制是:0110 1100 0100 1001,将这个比特流按三字节模板的分段方法分为0110 110001 001001,依次代替模板中的x,得到:1110-0110 10-110001 10-001001,即E6 B1 89,这就是其UTF8的编码。

汉: 0110 1100 0100 1001

套用: 1110XXXX 10XXXXXX 10XXXXXX

0110 110001 001001

UTF8: 11100110 10110001 10001001

而当你新建一个文本文件时,记事本的编码默认是ANSI, 如果你在ANSI的编码输入汉字,那么他实际就是GB系列的编码方式,在这种编码下,\"联通\"的内码是:

c1 1100 0001

aa 1010 1010

cd 1100 1101

a8 1010 1000

UTF8: 110XXXXX 10XXXXXX

注意到了吗?第一二个字节、第三四个字节的起始部分的都是\"110\"和\"10\",正好与UTF8规则里的两字节模板是一致的,于是再次打开记事本时,记事本就误认为这是一个UTF8编码的文件,让我们把第一个字节的110和第二个字节的10去掉,我们就得到了\"00001 101010\",再把各位对齐,补上前导的0,就得到了\"0000 0000 0110 1010\",不好意思,这是UNICODE的006A,也就是小写的字母\"j\",而之后的两字节用UTF8解码之后是0368,这个字符什么也不是。这就是只有\"联通\"两个字的文件没有办法在记事本里正常显示的原因。

而如果你在\"联通\"之后多输入几个字,其他的字的编码不见得又恰好是110和10开始的字节,这样再次打开时,记事本就不会坚持这是一个utf8编码的文件,而会用ANSI的方式解读之,这时乱码又不出现了。

最早ASCII码 7bit 27=128个字符

ASCII扩展 8bit 28=256个字符

扩展 GB2312(简体) 包括:ASCII(半角) - 每个字符使用1B=8bit

汉字 - 每个字符使用2B=16bit

全角(重新编码ASCII)-每个全角字符使用2B=16bit

BIG5 (繁体)

国际化统一的标准

UNICODE(UTF-16) 包括了世界上几乎所有的字符,每个字符占用2B=16bit

UTF-8,在UTF-16基础之上,采用了变长的存储方式

因篇幅问题不能全部显示,请点此查看更多更全内容