> 文档中心 > 【Java-IO】字符集(Character Set)、字符编码(Character Encoding)、字符编码比较、乱码

【Java-IO】字符集(Character Set)、字符编码(Character Encoding)、字符编码比较、乱码


八、IO

文章目录

  • 八、IO
    • 03_字符集(Character Set)
    • 04_字符编码(Character Encoding)
      • 字符编码比较
      • 乱码

03_字符集(Character Set)

在计算机里面

  • 一个中文汉字是一个字符
  • 一个英文字母是一个字符
  • 一个阿拉伯数字是一个字符
  • 一个标点符号是一个字符

字符集(简称 Charset):由字符组成的集合字符集(Character Set)

常见的字符集有:

  • ASCII:128个字符(包括了英文字母大小写、阿拉伯数字等)
  • ISO-8859-1:支持欧洲的部分语言文字,在有些环境也叫 Latin-1
  • GB2312:支持中文(包括了 6763 个汉字)
  • ASCII:128个字符(包括了英文字母大小写、阿拉伯数字等)
  • ISO-8859-1:支持欧洲的部分语言文字,在有些环境也叫 Latin-1
  • GB2312:支持中文(包括了 6763 个汉字)

ISO-8859-1GB2312BIG5GBKGB18030Unicode 中都已经包括了 ASCII 中的所有字符

04_字符编码(Character Encoding)

每个字符集都有对应的字符编码,它决定了每个字符如何转成二进制存储在计算机中。

  • 一个字节 = 8位二进制,即 1Byte = 8bit
  • 关于一个字符等于多少字节,是不确定的,主要看编码方式

ASCII:单字节编码,编码范围是 0x00 ~ 0x7F (0 ~ 127)

ISO-8859-1:单字节编码,编码范围是 0x00 ~ 0xFF

  • 0x00 ~ 0x7F 和 ASCII 一致,0x80 ~ 0x9F 是控制字符,0xA0 ~ 0xFF 是文字符号

GB2312BIG5GBK:采用双字节表示一个汉字

GB18030:采用单字节、双字节、四字节表示一个字符

Unicode:有 UnicodeUTF-8UTF-16UTF-32 等编码,最常用的是 UTF-8 编码

  • UTF-8 采用单字节、双字节、三字节、四字节表示一个字符

字符编码比较

String str = "MJ码哥";str.getBytes("ASCII");   // [ 77, 74, 63, 63 ]str.getBytes("ISO-8859-1");     // [ 77, 74, 63, 63 ]str.getBytes("GB2312");  // [ 77, 74, -62, -21, -72, -25 ]str.getBytes("BIG5");    // [ 77, 74, 63, -83, -12 ]str.getBytes("GBK");     // [ 77, 74, -62, -21, -72, -25 ]str.getBytes("GB18030"); // [ 77, 74, -62, -21, -72, -25 ]str.getBytes("UTF-8");   // [ 77, 74, -25, -96, -127, -27, -109, -91 ]

如果 String.getBytes 方法没有传参,就使用 JVM 的默认字符编码,一般跟随 main 方法所在文件的字符编码

可以通过 Charset.defaultCharset 方法获取 JVM 的默认字符编码

  • Charset 类的全名是 java.nio.charset.Charset

乱码

计算机中真正的代码其实是二进制,所以转到它是编码,它转别的就是解码

  • 【字符串】转为【二进制】的过程:编码(Encode)
  • 【二进制】转为【字符串】的过程:解码(Decode)

编码、解码时使用的字符编码必须要保持一致,否则会造成乱码

String str1 = "Java不难";// UTF-8编码为二进制: [74, 97, 118, 97, -28, -72, -115, -23, -102, -66]byte[] bytes = str1.getBytes("UTF-8");// GB18030解码: Java涓嶉毦String str2 = new String(bytes, "GB18030");// UTF-8解码: Java不难String str3 = new String(bytes, "UTF-8");

QQ头像吧