首先要明确,中文出现乱码的原因是编码和解码不一致导致的。
中文乱码出现的情景
- 字节与字符
- I/O
- JavaWeb
- 数据库
字节与字符
/**
* 编码方式和解码方式不一致导致乱码
* @throws UnsupportedEncodingException
*/
@Test
public void stringCharSetTest() throws UnsupportedEncodingException {
byte [] bytes = "你好".getBytes("GBK"); //进行GBK编码
String gbk = new String(bytes,0,bytes.length,"GBK");//GBK解码
String utf8 = new String(bytes,0,bytes.length,"UTF-8");//UTF-8解码
String iso8859 = new String(bytes,0,bytes.length,"ISO-8859-1");//ISO-8859-1解码
System.out.println("gbk:"+gbk);
System.out.println("utf8:"+utf8);
System.out.println("iso8859:"+iso8859);
}
输出结果:
gbk:你好
utf8:���
iso8859:ÄãºÃ
因为使用的是GBK编码,所有只有进行GBK解码才不会出现中文乱码的情况。
/**
* 对已经出现中文乱码的字符串进行编码重设
* @throws UnsupportedEncodingException
*/
@Test
public void stringChatsetChangeTest() throws UnsupportedEncodingException {
byte [] bytes = "你好".getBytes("UTF-8"); //进行UTF-8编码
//进行GBK解码
String gbkDecoding = new String(bytes,0,bytes.length,"GBK") ;
System.out.println("对UTF8进行GBK解码操作:"+gbkDecoding);
//解决中文乱码问题
//先获取原来UTF8编码的字节
byte [] gbkByte = gbkDecoding.getBytes("GBK");
//再进行UTF8编码
String utf8Decoding = new String(gbkByte,0,gbkByte.length,"UTF-8");
System.out.println("进行了中文乱码处理:"+utf8Decoding);
}
输出结果
对UTF8进行GBK解码操作:浣犲ソ
进行了中文乱码处理:你好
解决中文乱码问题首先要知道原编码的编码类型,然后在进行对应编码方式的解码操作。
I/O
/**
* 对已知编码方式的文本文件进行读取操作
*/
@Test
public void IOCharsetTest() throws IOException {
BufferedReader bufferedReader
= new BufferedReader(new InputStreamReader(
new FileInputStream("charset.txt"), "GBK"));
String line = null;
System.out.println("以GBK的解码方式读取一UTF8编码的文件");
while ((line = bufferedReader.readLine()) != null) {
System.out.println(line);
}
bufferedReader = new BufferedReader(new InputStreamReader(
new FileInputStream("charset.txt"), "UTF-8")
);
System.out.println("以UTF-8的解码方式读取一UTF8编码的文件");
while ((line = bufferedReader.readLine()) != null) {
System.out.println(line);
}
}
JavaWeb
通过上面的测试可以知道,只要编码方式和解码方式一致,就不会出现中文乱码的情况。
在JavaWeb中,可以使用一下几种方式进行编码解码设置。
request解码设置
从客户端请求中设置编码方式,相当于解码操作。
- 设置request解码方式
req.setCharacterEncoding("UTF-8");
- -
response编码设置
响应客户端请求中设置编码方式,相当于编码操作。
- 设置头文件中的编码参数
resp.setHeader("content-type", "text/html;charset=UTF-8");
//或者
resp.setContentType("text/html;charset=UTF-8");
- 设置response的编码方式
resp.setCharacterEncoding("UTF-8");