字符集
规定了 某个文字 对应的 存储值(流中的二进制数据) 的一一对应关系
同一个文字在不同字符集 UTF-8 GBK 中对应的二进制数据是不一样的
对于一个字符集 三个要素: 字库表-->字符集能表示的所有字符的范围(ASSII和Unicode和GBK都不一样)
编码字符集-->用一个编码值标示一个字符在字符集中的位置(codePoint)
字符编码-->编码字符集(字符在集中的序列号)和字符实际存储值对应关系
有的字符集就不包括中文,有的字符集没有日文
Unicode是一个编码字符集(字库表包括中日英)
字符编码存在的原因
大家都把编码字符集当做存储值不就完事了吗,还要字符编码 干什么??
比如对于Unicode来说,它包含所有字符,如果使用字符序号(编码字符集)来进行存储,
那么每一个字符都需要三个字节(字符太多了),对于欧美国家用不到中文的,
存储起来就有点浪费;这就是接下来UTF-8出现的原因了
UTF-8和Unicode的关系
Unicode的编号从0000开始一直到10FFFF共分为16个Plane(一个Plane 65535个字符)
UTF-8仅仅实现了第一个Plane,以至于当有序列超过65535的字符时候,UTF-8就会出问题;
UTF-8是变长的,1-3字节,每个字节的靠头标示了这是个单字节字符还是多字节字符
解决乱码
GBK与Unicode 是不同的字符集,编码方式自然也不同。
先把乱码按照本机的字符集编码,然后用乱码本身能正确标示的字符集的字符编码进行解码
Unicode有两种编码方式 UTF-8 和UTF-16
(一般字符集是一种,就是因为unicode 为了效率问题才有了两种编码方式)