字符集

464 阅读3分钟

字符集

各类字符集

  • ASCII字符集

  • GB2312字符集

    • 1980年发布,1981年5月1日实施的简体中文汉字编码国家标准,收录7445个图形字符,其中包括6763个简体汉字
  • BIG5字符集

    • 台湾地区繁体中文标准字符集,共收录13053个汉字,1984年实施
  • GBK字符集

    • 2000年3月17日发布,收录21003个汉字,包含国家标准GB13000-1中的全部中日韩汉字,和BIG5编码中的所有汉字
    • windows系统默认使用的就是GBK,系统显示:ANSI
  • Unicode字符集

    • 国际标准字符集,它将世界各种语言的每个字符都定义一个唯一的编码,以满足跨语言、跨平台的文本信息转换

计算机的存储规则

英文ASCII

  • 存储英文,一个字节都足够

  • ASCII编码规则:前面补0,补齐8位

  • ASCII解码规则:直接转成十进制

Snipaste_2022-12-06_18-27-14.png

英文GBK

  • 英文用一个字节存储,完全兼容ASCII
  • GBK英文编码规则:不足8位,前面补0

Snipaste_2022-12-06_19-45-48.png

汉字GBK

  • 汉字用两个字节存储(一个)

  • 高位字节二进制一定以1开头,转成十进制之后是一个负数

  • GBK汉字编码规则:不需要变动

Snipaste_2022-12-06_20-21-50.png

Unicode

  • UTF:Unicode Transfer Format:将Unicode字符集中的数字进行转换格式化的一种方式

  • UTF-16编码规则:用2~4个字节保存·

  • UTF-32编码规则:固定使用四个字节保存

  • UTF-8编码规则:用1~4个字节保存

    • 1个字节:ASCII
    • 2个字节:拉丁文、希腊文、西里尔字母、亚美尼亚语、希伯来文、阿拉伯文、叙利亚文
    • 3个字节:中日韩文字、东南亚文字、中东文字
    • 4个字节:其他语言
  • UTF-8编码方式(二进制)

    • 按照固定格式,其他部分由Unicode中查询到的数字的二进制形式进行填补
    • 一个英文占一个字节,二进制第一位是0,转成十进制是正数
    • 一个中文占三个字节,二进制第一位是1,第一个字节转成十进制是负数

Snipaste_2022-12-06_20-41-53.png

Snipaste_2022-12-06_20-42-23.png

Snipaste_2022-12-06_20-42-49.png

乱码

产生乱码的原因

  • 读取数据时未读完整个汉字

Snipaste_2022-12-06_20-54-29.png

  • 编码和解码时的方式不统一

Snipaste_2022-12-06_20-54-00.png

如何不产生乱码

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

字节流读取中文会乱码,但是为什么拷贝

  • 读取数据的时候有解码的过程,但是编码解码使用的码表不一样,产生乱码

  • 在文件拷贝的过程中并没有解码的过程,只用当打开记事本时才会有解码的过程,但是同一个记事本编码解码使用的码表时一样的,因此不会产生乱码

编码和解码

Java中编码的方法

String类中的方法说明
public byte[] getBytes()使用默认方式进行编码IDEA:UTF-8 eclipse:GBK
public byte[] getBytes(String charsetName)使用指定方式进行编码,要抛出异常

Java中解码的方法

String类中的方法说明
String(byte[] bytes)使用默认方式进行解码
String(byte[] bytes, String charsetName)使用指定方式进行解码