(请观看本人博文——《详解 字符流》)
在我们的日常编程中,经常会遇到 乱码 的问题,这是什么原因呢?
这个问题就牵扯到了本篇博文的主题 —— 编码与解码:
编码:
定义:
所谓 编码, 就是把 字符串 转换成 字节数组
简单来讲,就是:
把看得懂的变成看不懂的: String -- byte[]
那么,根据本人上述所讲,差不多就可以明白,我们编码所用的方法就是:
String类的getBytes()方法:
- byte[] getBytes()
使用平台的默认字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中- byte[] getBytes(Charset charset)
使用给定的 charset字符集 将此 String 编码到 byte 序列,并将结果存储到新的 byte 数组- byte[] getBytes(String charsetName)
使用指定的字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中void getBytes(int srcBegin, int srcEnd, byte[] dst, int dstBegin)
已过时。 该方法无法将字符正确转换为字节。从 JDK 1.1 起,完成该转换的首选方法是通过 getBytes() 方法,该方法使用平台的默认字符
解码:
定义:
所谓 编码, 就是把 字节数组 转换成 字符串
简单来讲,就是:
把看不懂的变成看得懂的: byte[] -- String
那么,根据本人上述所讲,差不多就可以明白,我们编码所用的方法就是:
String类的构造方法:
- String(byte[] bytes)
通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String- String(byte[] bytes, Charset charset)
通过使用指定的 charset字符集 解码指定的 byte 数组,构造一个新的 String- String(byte[] bytes, int offset, int length)
通过使用平台的默认字符集解码指定的 byte 子数组,构造一个新的 String- String(byte[] bytes, int offset, int length, Charset charset)
通过使用指定的 charset字符集 解码指定的 byte 子数组,构造一个新的 String- String(byte[] bytes, int offset, int length, String charsetName)
通过使用指定的字符集解码指定的 byte 子数组,构造一个新的 StringString(byte[] ascii, int hibyte, int offset, int count)
已过时。 该方法无法将字节正确地转换为字符。从 JDK 1.1 开始,完成该转换的首选方法是使用带有 Charset、字符集名称,或使用平台默认字符集的 String 构造方法String(byte[] ascii, int hibyte)
已过时。 该方法无法将字节正确地转换为字符。从 JDK 1.1 开始,完成该转换的首选方法是使用带有 Charset、字符集名称,或使用平台默认字符集的 String 构造方法
本人现在来给出一个例子,来展示下编码和解码的过程:
package edu.youzg.about_io.about_file.core;
import java.io.UnsupportedEncodingException;
public class Test {
public static void main(String[] args) throws UnsupportedEncodingException {
String str="音无结弦之时";
byte[] bytes = str.getBytes(); //采用默认的码表进行编码
String s = new String(bytes);//采用 默认的码表进行解码
System.out.println(s);
//可以 指定码表进行编解码
String str2="悦动天使之心";
byte[] bytes1 = str2.getBytes("gbk");
//解码
String s1 = new String(bytes1,"gbk");
System.out.println(s1);
}
}
那么,本人来展示下输出结果:
那么,现在,本人再来讲解下我们经常会遇到的问题 —— 乱码:
乱码:
原因:
编/解码 用的不是同一个码表
那么,现在本人就来展示下不用同一张码表的输出结果:
package edu.youzg.about_io.about_file.core;
import java.io.UnsupportedEncodingException;
public class Test {
public static void main(String[] args) throws UnsupportedEncodingException {
//编码
String str = "立于浮华之世,奏响天籁之音";
byte[] bytes = str.getBytes("gbk");
//解码
String s = new String(bytes,"utf-8");
System.out.println(s); //出现乱码
}
}
那么,本人现在来展示下运行结果:
我们可以清晰地看到 —— 由于我们编/解码所用的码表不同,所以出现了乱码!
(本人《详解 字节流 与 字符流》博文链接:https:////www.cnblogs.com/codderYouzg/p/12418532.html)
(本人 I/O流总集篇 博文链接:https:////www.cnblogs.com/codderYouzg/p/12418404.html)