天天看點

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的中英文編碼和解碼問題