【Java】中文乱码探究

首先要明确,中文出现乱码的原因是编码和解码不一致导致的。

中文乱码出现的情景

  1. 字节与字符
  2. I/O
  3. JavaWeb
  4. 数据库

字节与字符

 /**
   * 编码方式和解码方式不一致导致乱码
   * @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");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值