(1)通讯双方都采用相同的编码,用到的也都是编码内的字符,则通讯不会发生异常。举例如下:
String s = "0中国A";
byte[] b1 = s.getBytes();
byte[] b2 = new String(b1).getBytes();
for (int i = 0; i < b1.length; i++) {
System.out.println(b1[i] + " <-> " + b2[i]);
}
输出结果:
48 <-> 48
-28 <-> -28
-72 <-> -72
-83 <-> -83
-27 <-> -27
-101 <-> -101
-67 <-> -67
65 <-> 65
说明 相同编码,使用编码内的字符 String --> byte[] --> String --> byte[] 未出现失真现象。
(2)通讯报文内容中用到了字符编码外的字符,例如项目编码为GBK,GBK编码中不包含ascii为-5等等的一些字符编码。
故将 ascii为-5的这些byte[]转换为String时会发生失真。
例如:
byte[] b1 = new byte[10];
for (int i = 0; i < 10; i++) {
b1[i] = (byte) (i - 5);
}
byte[] b2 = new String(b1).getBytes();
for (int i = 0; i < 10; i++) {
System.out.println(b1[i] + " <-> " + b2[i]);
}
输出结果为:
-5 <-> -17
-4 <-> -65
-3 <-> -67
-2 <-> -17
-1 <-> -65
0 <-> -67
1 <-> -17
2 <-> -65
3 <-> -67
4 <-> -17
说明使用编码外的字符 byte[] --> String --> byte[] 出现失真现象。
(3)双方项目使用相同的编码(举例为GBK编码)传输中仍需要传输编码外的字符,
首先在String转byte[]时候使用ISO-8859-1编码,然后byte[]转String的时候也使用ISO-8859-1,
则不会发生失真现象,例如:
byte[] b1 = new byte[10];
for (int i = 0; i < 10; i++) {
b1[i] = (byte) (i - 5);
}
// 下面这一行,byte[] --> String --> byte[] 未发现失真。
byte[] b2 = new String(b1, "ISO-8859-1").getBytes("ISO-8859-1");
for (int i = 0; i < 10; i++) {
System.out.println(b1[i] + " <-> " + b2[i]);
}
输出结果如下:
-5 <-> -5
-4 <-> -4
-3 <-> -3
-2 <-> -2
-1 <-> -1
0 <-> 0
1 <-> 1
2 <-> 2
3 <-> 3
4 <-> 4