字符集
1.计算机的存储规则(ASCII):
- 要存储的字符先查询对应的ASCII表,得到对应的ASCII码
- 将对应的ASCII码编码(ASCII编码规则:前面补0,补齐8位),编码后放入计算机中储存
2.计算机的解码规则(ASCII):
- 将计算机存储的数据解码(转成十进制),得到对应的ASCII值
- 通过ASCII值取找到对应的字符
3.汉字字符集:
- GB2312字符集:1980年发布,11981年5月1日实施的简体中文汉字编码国家标准。收录7445个图形字符,其中包括6763个简体汉字
- BIG5字符集:台湾地区繁体中文标准字符集,共收录13053个中文字 ,1984年实施
- GBK字符集:2000年3月17日发布,收录21003个汉字,包括国家标准GB13000-1中的全部中日韩汉字,和BIG5编码中的所有汉字
- 简体中文的Windows系统默认使用的就是GBK,但是系统会显示ANSI(兼顾其它含有中文的不同国家的操作系统)
4.Unicode字符集:国际标准字符集,它将世界各种语言的每个字符定义一个唯一的编码,以满足跨语言、跨平台的文本信息转化。
5.计算机的存储规则(GBK):
- GBK字符集完全兼容ASCII字符集
- 如果存储的是英文或者是ASCII码中的内容,那就按照原有的存储方式(一个英文字母一个字节,二进制第一位是0)
- 如果存储的是汉字,汉字需要使用两个字节存储
- 两个字节分为高位字节和低位字节,高位字节二进制一定以1开头,转成十进制后是一个负数
Unicode
1.编码规则与ASCII和GBK编码规则就有很大的不同:
- UTF-16编码规则:用2~4个字节保存
- UTF-32编码规则:固定使用4个字节保存
- UTF-8编码规则:用1~4个字节保存(基本上使用这个,因此主要介绍utf-8)
2.在UTF-8(unicode transfer format)中,ASCII码使用1个字节储存,简体中文使用3个字节储存。
3.一位字节的ASCII码的首位必须是0,N位字节的第一个字节前N位为1,第N+1位为0,后面的每个字节都以10开头。比如4位字节的:11110xxx 10xxxxxx 10xxxxxx 10xxxxxx。
4.以汉字的“汉”为例,其二进制编码为01101100 01001001,查询utf-8编码规则,为
1110xxxx 10xxxxxx 10xxxxxxx ,将二进制编码按顺序填充到x中,最后即为11100110 10110001 10001001。
5.根据utf-8的规则,一个英文站一个字节,二进制第一位是0,转成十进制是正数;一个中文站三个字节,二进制第一位是1.第一个字节转成十进制是负数。
乱码
1.原因:
- 读取数据时未读完整个汉字(读取了部分字节)
- 编码和解码时的方式不统一
2.解决方案(Java):
- 不要用字节流读取文本文件(使用字符流)
- 编码解码时使用同一个码表,同一个编码方式
Java中编码和解码的方法
1.Java中编码的方法(String类中的方法):
String类中的方法 | 说明 |
public byte[] getBytes() | 使用默认方式进行编码 |
public byte[] getBytes(String charsetName) | 使用指定方式进行编码 |
在IDEA中默认编码方式是UTF-8,在eclipse中默认编码方式是GBK。
2.Java中解码的方法(String类的构造方法):
String类的g方法 | 说明 |
String(byte[] byte) | 使用默认方式进行解码 |
String(byte[] byte,String charsetName) | 使用指定方式进行解码 |