字符串构造函数操作系统之间的差异

时间:2013-07-17 14:51:14

标签: character-encoding java

我有以下代码:

byte[] b = new byte[len]; //len is preset to 157004 in this example
//fill b with data by reading from a socket
String pkt = new String(b);
System.out.println(b.length + " " + pkt.length());

这在Ubuntu上打印出两个不同的值; 157004和147549,但OS X上的值相同。此字符串实际上是由ImageIO库传输的图像。因此,在OS X上我能够将字符串解码为图像就好了,但在Ubuntu上我无法做到。

我在OS X上使用的是版本1.6.0_45,并且在Ubuntu上尝试了相同的版本,以及Oracle jdk 7和默认的openjdk。

我注意到我可以通过使用Latin-1解码来获得字符串长度等于字节数组长度:

String pkt = new String(b,"ISO-8859-1");

然而,这不能解码图像,理解正在发生的事情可能很困难,因为字符串对我来说就像垃圾一样。

我对使用相同的jdk版本但使用不同的操作系统这一事实感到困惑。

2 个答案:

答案 0 :(得分:7)

  

此字符串实际上是由ImageIO库传输的图像。

这就是你出错的地方。

图像文本数据 - 它是二进制数据。如果您确实需要在字符串中对其进行编码,则应使用base64。我个人喜欢public domain base64 encoder/decoder at iharder.net

这不仅适用于图像 - 对于所有二进制数据都是如此,这些数据不知道是特定编码中的文本...是否是声音,电影,Word文档,加密数据等等。永远不要只把它当作编码文本来对待它 - 这是灾难的秘诀。

答案 1 :(得分:0)

Ubuntu默认使用utf-8,这是一个可变长度编码,因此字符串和字节数据的长度不同。这是差异的根源,但对于解决方案,我推迟了Jon的回答。