字符集和乱码

一.字符集

1.计算机的存储规则

在计算机中,任意数据都是以二进制的形式(0、1)来存储的.。

一个0或者1叫作一个bit(比特位),在计算机中,把8个bit划分为一组。

字节:计算机最小的存储单元,一个字节可以存储2的8次方,256个数据

 2.ASCALL字符集

ASCALL字符集共128个字符,存储英文,一个字节就够了。

存储规则

  1. 将要存储的英文,查询ASCALL,找到对应的数字。
  2. 进行编码,编码规则为前面补0,补齐8位。
  3. 进行解码,解码规则为直接转成十进制。
  4. 将数字,查询ASCALL,读取到对应字符。

 3.GBK

3.1英文

存储规则:

  1. 要存储的英文,查询GBK,找到对应的数字。
  2. 进行编码,GBK英文编码规则为:不足8位,前面补0。

要求:英文用一个字节存储,完全兼容ASCALL,前面补0。

 3.2汉字

存储规则:

  1. 将要存储的汉字,查询GBK,找到对应的数字。
  2. 进行编码,GBK汉字编码规则不需要变动。
  3. 进行解码,解码规则为直接转成十进制。
  4. 将数字,查询GBK,读取到对应字符。
  5. 规则1:汉字两个字节存储(原因:一个字节不够,三个字节太多)
  6. 规则2:高位自家二进制一定以1开头,转成十进制后是一个负数。(原因:把中文和英文区分开)

 4.Unicode

  • utf-16编码规则:用2-4个字节保存
  • utf-32编码规则:固定使用4个字节保存
  • utf-8编码规则:用1~4个字节保存

注:utf-8的编码规则下,ascall用一个字节表示,简体中文用三个字节表示

存储规则:

  1. 将要存储的汉字,查询Unicode,找到对应的数字。
  2. 进行编码,查询utf-8汉字编码规则。
  3. 进行解码,解码规则为直接转成十进制。
  4. 将数字,查询Unicode,读取到对应字符。

 二.乱码

1.概述

乱码:真实的数据和读取出来的数据不一致。

扫描二维码关注公众号,回复: 17451721 查看本文章

2.原因

  1. 读取数据时为读完整的整个汉字。
  2. 编码时和解码时的方式不统一。

字节流:一次读取一个字节

 3.不产生乱码

  1. 不要用字节流读取文本文件。
  2. 编码解码时使用同一个码表,同一个编码方式。

 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。

猜你喜欢

转载自blog.csdn.net/qq_63644501/article/details/138445572