/**
燕十八 公益PHP培训
课堂地址:YY频道88354001
学习社区:www.zixue.it
**/
编码问题:
计算机里,只有010101
而人的世界里,有文字,有图片,有声音....
01 ---> 文字对应起来
人为的约定
65->A
66->B
...
...
0100 0001 [A,65]
2进制编码 到 字符的映射,就是字符集.
看自己的键盘
A-Z
a-z
0-9
+-*/&^%
不超过127个.
美国人在造计算机的时候,就没考虑到,还有其他的字符.
1111 1111
0000 0000 256种值,
1个字节8个位 就足够了.
事实上,7个位就够了,因为7个位,可能表示128种变化.
ascii
0-127来表示
0xxx xxxx ,最高位始终是0
到了中国
常用汉字3000多,生僻汉字不用说.
1个字节,够不够?
答:不够,任你变,不过256种.
思考:用2个字节来表示
[][]
0000 0000 0000 0000
1111 1111 1111 1111
0-> 65535,6万多种组合,够用了.
GB2312字符集
[202 197] 假如代表 中
[69 197] 代表 ?
[200 101]
202 197 69 197 200 101....
69和197整个理解,还是单理解成E
歧义: 就是因为单字节的小于127的值,正好是ascii的值.
如果就严格的2字节绑定,理解为中文,
则gb2312不能识别英文了.
问: 如何兼容ascii,又能双字节表示中文?
ascii 0-127
0xxxx xxxx
干脆 gb2312完全不占用0-127.
我的组合来自于
[129-255][129-255]
130 140 97 95 134 198
看:能几个中文,几个英文?
但是,中文的组合数,也少了.
只能组合10000+,
事实上,GB2312只能容纳6000多字
GBK还是双字节,如何扩充容量?
答:
GBK的第2低,低位,不再局限于129-255了,<127的也能用
140 35 65 179 82
问:几个中文,几个英文?
总结: 碰到>128的,就再往后找一字节.2字节理解成中文.
继续找,
找到>128的,就带个家属. ,127的,就单身
中国 GBK
[137][134] ->中
到了日本呢?
[137][134]-> す ふに 呆
jis
ANSI 代表本地字符集
在中文操作 GBK
在日本 JIS
中文-->
中华人民颐和园
拿到日本-->读-->乱?
解决了多字节之后, 又相来一个问题----世界各国的字符集,兼容问题.
终极大招: Unicode
unicode是一个世界通用的码表
00000000 0000 0041 -->A
......................中
..................->す
全世界的范围的字符,统一分配一个标号.
这样,不会乱了.
unicode用4个字节,来编号
2^32 ,40多亿, 天文数字. 足够用了
但我们常用的,集中在 前65535个标号里.
2个字节就够了.
但是,unicode只负责分配编号用的,而且都用4个字节来分配编号.
你负责编号,
我负责在不改变你编号的基础上,简化字节.
0000 0000 0000 0000 0000 0000 0000 0041 ->A
0000 0041 ->A
把高位浪费的0值,用一定的规则舍弃.
形成的编码方式 ,
unicode与utf-8的关系
就像原文件 --> 压缩文件的关系.
问: 给定unicode字符---> utf-8的二进制值?
utf-8的二进制值?--->unicode字符
utf8占几个字节呢?
不可能定长,否则压缩还有什么意义?
变长,如何确定字符的边界?
23 179 234 123
如何截取utf8(各国语言都有),无乱码?
答: 从头开始,取1个字节.
通过位运算,计算连续的1的个数.
如为0,则截取1个字节
如为N,则截取N个字节
从容量上来看
GB2312 < GBK < UTF-8
问: GBK中文经常在java中,被转为utf-8?
答:怎么转的?
GBK 也是和unicode有对应关系的.
GBK->unicode->utf-8
乱码是如何形成的?
utf-8-->转成gb2312,
容量大 容量小
丢失了字节?
连接器的特性: 连接客户端与服务器
客户端的字符先发给连接器
连接器选择一种编码将其转换,临时存储
再次转换成 服务器需要的编码,并存储在服务器
燕十八老师太幽默了, 昨天的视频如下:
http://www.tudou.com/programs/view/5xOUBkB_T4Q/