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);
}
}