Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Character encoding 操作系统之间的字符串构造函数差异_Character Encoding_Java - Fatal编程技术网

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

Character encoding 操作系统之间的字符串构造函数差异,character-encoding,java,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上的值相同。此字符串

我有以下代码:

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库传输的图像。因此,在OSX上,我可以很好地将字符串解码成图像,但在Ubuntu上,我不能

我在OSX上使用了1.6.0_45版本,在Ubuntu上尝试了相同的版本,除了Oracle jdk 7和默认的openjdk

我注意到,我可以通过拉丁语-1解码得到字符串长度等于字节数组长度:

String pkt = new String(b,"ISO-8859-1");
然而,这并不能使解码图像成为可能,并且理解正在发生的事情可能很困难,因为字符串在我看来像垃圾

我很困惑,我使用的是同一个jdk版本,但不同的操作系统

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

这就是你错的地方

图像不是文本数据,而是二进制数据。如果确实需要将其编码为字符串,则应使用base64。就我个人而言,我喜欢这本书

这不仅适用于图像,也适用于在特定编码中未知为文本的所有二进制数据。。。无论是声音、电影、Word文档、加密数据等,都不要将其视为编码文本——这会导致灾难

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

这就是你错的地方

图像不是文本数据,而是二进制数据。如果确实需要将其编码为字符串,则应使用base64。就我个人而言,我喜欢这本书


这不仅适用于图像,也适用于在特定编码中未知为文本的所有二进制数据。。。无论是声音、电影、Word文档、加密数据等,都不要将其视为编码文本——这会导致灾难。

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

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

Duplicate of?为什么要将其转换为string?是BASE64编码比特数组吗?重复的?为什么要将其转换为字符串?它是BASE64编码的比特数组吗?所以当我写它时,我使用ImageIO.write(ByteArrayOutputStream),然后把它写到ByteBuffer。所以我只需要在base64中解码,对吗?@codersarepople:不,您可以直接用base64将
字节[]
转换成字符串。。。这就是编码。然后,当字符串在另一端恢复时,您将再次将其从base64解码为
字节[]
,然后将其包装在
ByteArrayInputStream
中。因此,当我编写它时,我使用ImageIO.write(ByteArrayOutputStream),然后将其写入ByteBuffer。所以我只需要在base64中解码,对吗?@codersarepople:不,您可以直接用base64将
字节[]
转换成字符串。。。这就是编码。然后,当字符串在另一端恢复时,您将再次将其从base64解码为
字节[]
,然后将其包装在
ByteArrayInputStream
中。