将字节数组转换为字符串 (Java)

我正在Google App Engine中编写一个Web应用程序。它允许人们基本上编辑html代码,这些代码作为文件存储在blobstore中。.html

我正在使用 fetchData 返回文件中所有字符的 a。我正在尝试打印到html,以便用户编辑html代码。一切都很棒!byte[]

这是我现在唯一的问题:

字节数组在转换回字符串时遇到一些问题。聪明的报价和几个角色看起来很时髦。(?'s 或日语符号等)具体来说,我看到的几个字节具有导致问题的负值。

智能报价将作为字节数组返回和在字节数组中。为什么会这样,我该如何解码负字节以显示正确的字符编码?-108-109


答案 1

字节数组包含特殊编码的字符(您应该知道)。将其转换为字符串的方法是:

String decoded = new String(bytes, "UTF-8");  // example for one encoding type

顺便说一句 - 原始字节出现可能显示为负小数,只是因为java数据类型是有符号的,它涵盖了从-128到127的范围。byte


-109 = 0x93: Control Code "Set Transmit State"

值 (-109) 是 UNICODE 中不可打印的控制字符。因此,UTF-8 不是该字符流的正确编码。

0x93在“Windows-1252”中是您要查找的“智能引号”,因此该编码的Java名称是“Cp1252”。下一行提供测试代码:

System.out.println(new String(new byte[]{-109}, "Cp1252")); 

答案 2

Java 7 及更高版本

还可以将所需的编码作为标准字符中的常量传递给构造函数。这可能比将编码作为 a 传递更安全,如其他答案中所建议的那样。StringCharsetString

例如,对于 UTF-8 编码

String bytesAsString = new String(bytes, StandardCharsets.UTF_8);

推荐