mysql 乱码专题

二进制编码到 字符的映射就是字符集

最古老的字符集是ascii

看自己的键盘

A-Z

a-z

0-9

不超过127个,所以,美国人在造计算机的时候,就没考虑到还有其他的字符

所以一个字节可以表示256种值,所以

ascii

0-127来表示,只能用到7位

0xxxx xxxx,最高位始终是0

到了中国,常用汉字3000多,生僻汉字不用说。

1个字节不够表示

用2个字节表示,

0000 0000 0000 0000

1111 1111 1111 1111

0-65535种组合,够用

所以出现了GB2312 字符集

【69 197】   69 和197整个理解还是单理解为E

歧义:因为单字节小于127的值,正好是ascii的值,

如果就严格的2字节绑定,理解为中文,

则gb2312不能识别英文

如何兼容ascii,又能双字节表示中文?

ascii 0-127

干脆gb2312完全不占用0-127,

使用组合来自于

【129-255】【129-255】

但是同时,中文的组合数也少了,只能组合10000+,

事实上,gb2312只能容纳6000多字,

所以出现了gbk

gbk还是双字节,如何扩充容量

答:gbk的第二位,不再局限与129-255,<127也能用

碰到>128的,就在往后找一个字节,2个字节绑定为一个中文,继续找

gbk可存放20000+   

这就是ANSI,代表本地字符集,在中国是gbk,在日本就是jis。

后来就产生了unicode 代表国际化字符集

用4个字节来编号,unicode的实现方式称为utf8,即将Unicode简化后进行传输

unicode与utf-8的关系就像源文件与压缩文件的关系

uft8占几个字节?

1-6个字节,既然为变长,如何确定字符的边界?

最高位有几个1就表示几位

如何截取utf8(各国语言都有),无乱码?

答:从头开始,取一个字节,通过位运算,计算连续的1个字节,

如为0,则截取1个字节,

如为N,  则截取n个字节

从容量上来看,GB2312<GBK<UTF-8

问:gbk中文经常在java中,被准为utf-8,怎么转的?

答:gbk也是和unicode有对应关系的,

gbk->unicode->utf-8

乱码是怎么形成的?

答:1.解码时与实际编码不一致,即解码时用jis,编码时用gbk,可修复

  使编码与解码一致即可解决

  2。传输时,编码不一致,导致字节丢失。不可修复

  如将utf-8传输成gbk

猜你喜欢

转载自www.cnblogs.com/fbjtcp/p/10916524.html