编解码是否一一映射?
程序员文章站
2022-05-08 19:22:00
...
ByteArrayOutputStream baos=new ByteArrayOutputStream();
DataOutputStream dos=new DataOutputStream(baos);
dos.writeByte(2);
dos.writeByte(3);
dos.writeByte(0x83);
String data=baos.toString();
byte[] buf=baos.toByteArray();
ByteArrayInputStream bais1=new ByteArrayInputStream(data.getBytes());
DataInputStream dis1=new DataInputStream(bais1);
System.out.println(dis1.readByte());
System.out.println(dis1.readByte());
System.out.println(dis1.readUnsignedByte());
System.out.println("------------------------------------");
ByteArrayInputStream bais2=new ByteArrayInputStream(buf);
DataInputStream dis2=new DataInputStream(bais2);
System.out.println(dis2.readByte());
System.out.println(dis2.readByte());
System.out.println(dis2.readUnsignedByte());
打印结果:
2
3
239
------------------------------------
2
3
131
问
题:
为什么这2个打印结果不一样呢?
回 答:
这个原因应该是某些码值在某些字符集下编解码过程非一一映射导致
某些默认系统编码比如GBK,在decoding时,即
baos.toString(),会出现malformed-input和unmappable-character
sequences被系统默认串替代的情况;在encoding时,即data.getBytes(),也会出现在默认字符集中无法被编码的串,这时候结
果是未定的。
验证一下,替换 dos.writeByte(0x83) => dos.writeByte(0x7f)
结果则是一样的 都是127
由此可见。