ASCII(美国标准信息交换码):
字符与数字对应的编码规则。
最高bit位都为0(0,127)
GB2312:(国标码)
中文字符都用两个字节表示
每个字符的最高位bit为1
GBK:(国标K)
在GB2312基础上,对更多的中文字符进行编码。
BIG5:(大五码)
台湾地区对中文字符集的编码规则
Unicode:(国际通用码)
占用两个字节。
对ASCII的字符高位加0
表示范围2的16次方。还保留2000多个数值
UTF-8 :通用字符编码的统一转换
对不同范围内的字符,采用不同的字节个数来表示。
ASCII码保持不变。
其他国家的字符采用两个或三个字节来表示。
通常用EF BB BF 作为文件开头的三个字节数据。
UTF-8 与Unicode的转换关系:
/u0001和/u007f之间的字符,编码为(byte)c
/u0000或者/u0080和/u07ff之间的字符,编码为:(byte)(0xc0|0x1f&(c>>6))),(byte)(0x80|(0x3f&c))
/u0800和/uffff之间的字符,编码为:(byte)(0xe0|(0x0f&(c>>12))),(byte)(0x80|(0x3f&(c>>6))),(byte)(0x80|(0x3f&c))
优点:
不出现内容为0x00字节
便于应用程序检测数据在传输过程中是否发生错误。
直接处理使用ASCII码的英文文档。
缺点:
有些字符需要三个字节。
UTF-16:
在Unicode的细节上的扩充,只是增加了对Unicode编码没有包括的那些字符的表示方式。
Unicode将0xD800-0xDFFF保留出来,(2048)进行扩充用。占用4个字节。
前两个字节0xD800-0xD8FF.后两个字节为0xDC00-0xDFFF
如果文件以0xFE 0xFF开头表明文本的其余部分是Big-Endian的Utf-16编码(高字节在前,低字节在后)
如果以0xFF 0xFE开头,表明是Little-Endian的utf-16编码(高字节在后,低字节在前)
设置系统默认字符集
System.setProperty("file.encoding","iso8859-1");//美国字符集
System.getProperties().list(System.out);//打印
new String(strInfo.getBytes("iso8859-1"),"gb2312"));//原始码是Unicode.方可解码。
如果直接用“iso8859-1”进行Unicode编码.格式一般是把字节对半拆开,然后再在前加两个00
乱码情况:
1,编写时的指定的编码,和输出时的编码不一致
2,编写时指定的编码,外部不支持
3,编写时指定的编码,外部也支持。但是误导使用者是另一种编码