前言
由于要解决文档中的乱码,就查找了乱码产生的原因。
乱码是因为解码方式和编码方式不一致导致的!!!
如用UTF-8编码“中文”这个词,用ASCll来解码,会输出??
,用GBK中就会输出乱码(看不懂的符号)。
在此总结下字符的编码格式:
ASCII 码
ASCII 码(美国信息互换标准代码),使用一个字节(byte)进行存储。包含英文,标点符号,数字。适用于纯英文环境的使用。互联网初期通用编码!
一个字节包含8个二进制位bit(00000000-11111111),可以存储256种状态。
Unicode 字符集:
包含当前出现的所有字符,每个字符一个唯一的码点(code point)。但未规定存储方式。java默认使用Unicode字符集。编码方式包含:UTF-8,UTF-16,UTF-32 三种
UTF-8
UTF-8 是Unicode字符集实现的一种编码方式,仅包含Unicode的一部分内容,可供日常使用
特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。java默认使用utf-8编码方式
UTF-8 的编码规则很简单,只有二条:
1)对于单字节的符号:字节的第一位设为0,后面7位为这个符号的 Unicode 码。因此对于英语字母,UTF-8 编码和 ASCII 码是相同的;
2)对于n字节的符号(n > 1):第一个字节的前n位都设为1,第n + 1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的 Unicode 码。
UTF-16 UTF-16 编码最小单位是两个字节,所以有字节序的问题(分大端序和小端序)。jvm中采用utf-16进行存储
UTF-32 采用4个字节存储。码点值是多少,内存中就存多少
中文编码
gb2312,GBK,gb18030
GB2312 中国国家标准简体中文字符集。收录6763个汉字,基本满足了字的计算机处理需要。
GBK GBK是gb2312的扩展级,包含了更多的汉字!只是一种标准。
GB18030 全称《信息技术 中文编码字符集》。收录汉字70,244个。兼容gb2312和GBk
其他
ISO-8859-1 单字节编码,向下兼容ASCII,增加了欧洲的部分字符,字符范围是0-255
编码转化方式
即GBK、GB2312等与UTF8之间都必须通过Unicode编码才能相互转换:
- GBK、GB2312 --先转–> Unicode --再转–> UTF8
- UTF8 --先转–> Unicode–再转–> GBK、GB2312
小结
ASCII码使用一个字节存储,是最基础的一种编码格式。其中的非打印类的字符均包含在其他的编码格式中;
Unicode包含的字符最多,UTF-8在互联网上使用最多
中文主要涉及三大派系:
- ASCll
- Unicode
- GBK