/*
计算机里,只有010101
而人的世界里,有文字,声音,图片,视频...
01==>与文字对应
人为的约定
65->A
66->B
...
...
0100 0001 代表:A还是65 要看规则
2进制编码 到 字符的映射,就是字符集。
A-Z
a-z
+_*&^%$#@!
不超过127个.
美国人造计算,就考虑到自己使用,能表示127 个字符就行
一个字节就够存储127 个字符
1111 1111
0000 0000 256种值
1个字节8个位,就足够了.
事实上,7个位就够了,7个位表示128中变化
ASCII
0-127 来表示的
0xxx xxxx ,最高位始终是0
*/
/*
中国
常用汉字3000多,生僻汉字不用说.
1个字节,够不够?
答:不够,最多不过256种。
思考:用2个字节来表示
1111 1111 1111 1111
0000 0000 0000 0000
0->65535,6万多种组合,够用了
GB2312 字符集
GBK
GBK还是双字节,如何扩充容量
答:
GBK的第2位,低位,不在局限于129-255,小于127的也能用
140 35 65 179 82
问:几个中文,几个英文?
总结:碰到>128的,就在往后找一个字节,2个字节理解成中文。
找到大于128的,就带一个字节==》合起来表示一个字符
小于128的就是一个字节==》表示一个字符
日本使用JIS字符集
世界各国字符集,兼容问题
国际通用码表:unicode
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-82进制值?
答:当然能,互相推出。编码与解码的关系
unicode 和utf-8 转换关系表
4个字节 ---> 1个到6个字节 不固定用几个字节,关键看对应 的规则
utf-8占几个字节呢?
答:1个到6个字节 不固定用几个字节。
utf-8变长,如何确定字符的边界呢?
最高位
0xxxxxxx
11xxxxxx xxxxxxxx
111Xxxxx xxxxxxxx xxxxxxxx
1111xxxx xxxxxxxx xxxxxxxx xxxxxxxx
11111xxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx
111111xx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx
最多用到6个字节
如何截取utf-8编码时无乱码?
答:
1:从头开始取一个字节,
通过位运算,计算连续1的个数
如为0,则截取1个字节
如为11,则截取2个字节
如为111,则截取3个字节
...
...
如为111111,则截取6个字节
从容量上来看?
GB2312 < GBK < UTF-8
问:GBK中文在java中,被转为utf-8 ,怎么转的?
答:GBK 和unicode有对应关系
通过中间unicode码表转的
GBK -> unicode ->UTF-8