一.字符集
1.计算机的存储规则
在计算机中,任意数据都是以二进制的形式(0、1)来存储的.。
一个0或者1叫作一个bit(比特位),在计算机中,把8个bit划分为一组。
字节:计算机最小的存储单元,一个字节可以存储2的8次方,256个数据
2.ASCALL字符集
ASCALL字符集共128个字符,存储英文,一个字节就够了。
存储规则
- 将要存储的英文,查询ASCALL,找到对应的数字。
- 进行编码,编码规则为前面补0,补齐8位。
- 进行解码,解码规则为直接转成十进制。
- 将数字,查询ASCALL,读取到对应字符。
3.GBK
3.1英文
存储规则:
- 要存储的英文,查询GBK,找到对应的数字。
- 进行编码,GBK英文编码规则为:不足8位,前面补0。
要求:英文用一个字节存储,完全兼容ASCALL,前面补0。
3.2汉字
存储规则:
- 将要存储的汉字,查询GBK,找到对应的数字。
- 进行编码,GBK汉字编码规则不需要变动。
- 进行解码,解码规则为直接转成十进制。
- 将数字,查询GBK,读取到对应字符。
- 规则1:汉字两个字节存储(原因:一个字节不够,三个字节太多)
- 规则2:高位自家二进制一定以1开头,转成十进制后是一个负数。(原因:把中文和英文区分开)
4.Unicode
- utf-16编码规则:用2-4个字节保存
- utf-32编码规则:固定使用4个字节保存
- utf-8编码规则:用1~4个字节保存
注:utf-8的编码规则下,ascall用一个字节表示,简体中文用三个字节表示
存储规则:
- 将要存储的汉字,查询Unicode,找到对应的数字。
- 进行编码,查询utf-8汉字编码规则。
- 进行解码,解码规则为直接转成十进制。
- 将数字,查询Unicode,读取到对应字符。
二.乱码
1.概述
乱码:真实的数据和读取出来的数据不一致。
扫描二维码关注公众号,回复: 17451721 查看本文章
2.原因
- 读取数据时为读完整的整个汉字。
- 编码时和解码时的方式不统一。
字节流:一次读取一个字节
3.不产生乱码
- 不要用字节流读取文本文件。
- 编码解码时使用同一个码表,同一个编码方式。
4.Java中编码和解码的方式
4.1Java中的编码方式
String类中的方法 | 说明 |
public byte[] getBytes() | 使用默认方式进行编码 |
public byte[] getBytes(String charsetName) | 使用指定方式进行编码 |
注:使用指定方式进行编码时,参数可以大写也可以小写,推荐使用大写。
4.2Java中的解码方式
String类中的方法 | 说明 |
String(byte[] bytes) | 使用默认的方式进行解码 |
String(byte[] bytes,String charsetName) | 使用指定的方式进行解码 |
注:idea使用的是Unicode的utf-8,eclipse使用的是GBK。