62,614
社区成员
发帖
与我相关
我的任务
分享
public class EncodeTest {
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
String codeA = "UTF-8";
String codeB = "GBK";
String codeC = "UTF-16";
// GBK是等长码,码长是固定的,2字节。
// UTF8是非等长码,码长是变化的,通常1到3字节。
// 以猪为例,GBK只要2字节,D6ED。
// 你第一次转码的时候,你将字符串(java 内部 Unicode UTF16)经GBK解码的字节流,变成了D6ED。
// 再用UTF8编码。因为D6ED 不在 UTF8 有效编码范围内(UTF8有效编码网上自己找),
// 这两个字节于是被解释成两个非法字符。
// 接下来第二次,这两个非法字符再经UTF8解码变成6字节,每个字符3字节。码长变化了。
// 最后这6个bytes被当作GBK编码,于是得3个乱码字符。
// 如果是简单的单字节ASCII字符,就不会出现上述问题。 比如 str="X" 就不会有问题
String str = "猪";
System.out.println(str);
System.out.println(codeA + " : " + toHex(str.getBytes(codeA)));
System.out.println(codeA + " : " + toBinary(str.getBytes(codeA)));
System.out.println(codeB + " : " + toHex(str.getBytes(codeB)));
System.out.println(codeB + " : " + toBinary(str.getBytes(codeB)));
System.out.println(codeC + " : " + toHex(str.getBytes(codeC)));
System.out.println(codeC + " : " + toBinary(str.getBytes(codeC)));
System.out.println("------------------------------------------");
str = new String(str.getBytes(codeB), codeA);
System.out.println(str);
System.out.println(codeA + " : " + toHex(str.getBytes(codeA)));
System.out.println(codeA + " : " + toBinary(str.getBytes(codeA)));
System.out.println(codeB + " : " + toHex(str.getBytes(codeB)));
System.out.println(codeB + " : " + toBinary(str.getBytes(codeB)));
System.out.println(codeC + " : " + toHex(str.getBytes(codeC)));
System.out.println(codeC + " : " + toBinary(str.getBytes(codeC)));
System.out.println("------------------------------------------");
str = new String(str.getBytes(codeA), codeB);
System.out.println(str);
System.out.println(codeA + " : " + toHex(str.getBytes(codeA)));
System.out.println(codeA + " : " + toBinary(str.getBytes(codeA)));
System.out.println(codeB + " : " + toHex(str.getBytes(codeB)));
System.out.println(codeB + " : " + toBinary(str.getBytes(codeB)));
System.out.println(codeC + " : " + toHex(str.getBytes(codeC)));
System.out.println(codeC + " : " + toBinary(str.getBytes(codeC)));
System.out.println("------------------------------------------");
}
private static String toBinary(byte[] data) {
StringBuilder sb = new StringBuilder();
for (byte b : data) {
sb.append(Integer.toString(b & 0xff, 2)).append(" ");
}
return sb.toString();
}
private static String toHex(byte[] data) {
StringBuilder sb = new StringBuilder();
for (byte b : data) {
sb.append(Integer.toString(b & 0xff, 16).toUpperCase()).append(" ");
}
return sb.toString();
}
}
String str = "猪";
System.out.println(str);
System.out.println(codeA+Arrays.toString(str.getBytes(codeA)));
System.out.println(codeB+Arrays.toString(str.getBytes(codeB)));
System.out.println(codeC+Arrays.toString(str.getBytes(codeC)));
System.out.println("------------------------------------------");
str = new String(str.getBytes(codeB), codeA);
System.out.println(str);
System.out.println(codeA+Arrays.toString(str.getBytes(codeA)));
System.out.println(codeB+Arrays.toString(str.getBytes(codeB)));
System.out.println(codeC+Arrays.toString(str.getBytes(codeC)));
System.out.println("------------------------------------------");
str = new String(str.getBytes(codeA), codeB);
System.out.println(str);
System.out.println(codeA+Arrays.toString(str.getBytes(codeA)));
System.out.println(codeB+Arrays.toString(str.getBytes(codeB)));
System.out.println(codeC+Arrays.toString(str.getBytes(codeC)));
System.out.println("------------------------------------------");
}