天天看点

Java的中英文编码和解码问题

Java的中英文编码和解码问题

编码: 即将字符变成二进制数,然而二进制在高级预语言中用字节表示。所以编码可以理解成将字符转换成字节。

比如在民国时期,我们的身份是地下党,现在需要传一份秘密情报给我党,但是肯定不能用明文的方式传,因为大家都认识,所以我们我党早就定义了一种规则,比如 国民党 对应了 分别对应ABC三个字符,所以我们将国民党表示成ABC。那么这个将国民党用ABC表示的过程就是编码。 同理,我们将字符表示成字节也称为编码。

解码: 解码是编码的逆过程,即根据对应的编码规则(比如UTF-8, ISO-8859-1等)将字节转成对应的字符。

1. Java的英文编码解码问题

据目前测试所知,英文的编码解码在java中并没有什么区别,用UTF-8编码的英文,用ISO-8859-1能解码出来。

2. Java的中文编码解码问题

据目前测试所知,只有将中文编码为UTF-8, 并且按UTF-8解码才能正常显示。按照ISO-8859-1编码和按照ISO-8859-1解码都不能正常显示。

3. 测试代码

package org.jinyuxin.a2019070101;

import java.io.UnsupportedEncodingException;
import org.junit.jupiter.api.Test;

public class TestEncodeAndDecode {

  @Test
  public void testEncodeAndDecode() {

    String testStr = "ABC中文";

    //底层默认按utf-8编码
    byte[] strByte = testStr.getBytes();

    try {
      //按ISO-8859-1解码
      testStr = new String(strByte, "ISO-8859-1");
      System.out.println("按默认方式(UTF-8)编码,按ISO-8859-1解码后的字符串是:" + testStr);
    } catch (UnsupportedEncodingException e) {
      e.printStackTrace();
    }
  }

  @Test
  public void testEncodeAndDecode1() {

    String testStr = "ABC中文";
    //底层默认按utf-8编码
    byte[] strByte = testStr.getBytes();

    //默认按utf-8解码
    testStr = new String(strByte);

    System.out.println("按默认方式(UTF-8)编码,默认方式(UTF-8)解码后的字符串是:" + testStr);
  }

  @Test
  public void testEncodeAndDecode2() {

    String testStr = "ABC中文";
    //底层默认按utf-8编码
    byte[] strByte = testStr.getBytes();
    //指定按utf-8可以解码,说明底层是按这个规则编码的
    try {
      testStr = new String(strByte, "utf-8");
    } catch (UnsupportedEncodingException e) {
      e.printStackTrace();
    }

    System.out.println("按默认方式(UTF-8)编码,按UTF-8解码后的字符串是:" + testStr);

  }

  @Test
  public void testEncodeAndDecode3() {

    String testStr = "ABC中文";
    //按ISO-8859-1编码
    byte[] strByte = new byte[0];
    try {
      strByte = testStr.getBytes("ISO-8859-1");
    } catch (UnsupportedEncodingException e) {
      e.printStackTrace();
    }
    //默认按utf-8解码
    testStr = new String(strByte);

    System.out.println("按ISO-8859-1编码,按默认方式(UTF-8)解码后的字符串是:" + testStr);

  }

  @Test
  public void testEncodeAndDecode4() {

    String testStr = "ABC中文";
    //按ISO-8859-1编码
    byte[] strByte = new byte[0];
    try {
      strByte = testStr.getBytes("ISO-8859-1");
    } catch (UnsupportedEncodingException e) {
      e.printStackTrace();
    }
    //默认按ISO-8859-1解码
    try {
      testStr = new String(strByte, "ISO-8859-1");
    } catch (UnsupportedEncodingException e) {
      e.printStackTrace();
    }

    System.out.println("按ISO-8859-1编码,按ISO-8859-1解码后的字符串是:" + testStr);

  }

}

           

4. 测试结果

Java的中英文编码和解码问题