将字节数组转换为string(Java)

我在Google app Engine中编写一个Web应用程序。 它允许人们基本上编辑存储为.html文件的BLOB代码。

我使用fetchData来返回文件中所有字符的一个byte[] 。 我试图打印到一个HTML为了让用户编辑HTML代码。 一切都很好!

这是我现在唯一的问题:

字节数组在转换回string时遇到一些问题。 聪明的引号和几个字符出来看起来很时髦。 (?的或日本的符号等)具体来说,我看到有几个字节有负值导致的问题。

智能报价在字节数组中回到-108-109 。 为什么是这样的,我怎样才能解码负字节显示正确的字符编码?

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

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

顺便说一句 – 由于java数据typesbyte是有符号的,所以出现的原始字节可能会显示为负小数,它涵盖从-128到127的范围。


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

值(-109)是UNICODE中不可打印的控制字符。 所以UTF-8不是该字符stream的正确编码。

“Windows-1252”中的0x93是您正在查找的“智能报价”,因此该编码的Java名称为“Cp1252”。 下一行提供了一个testing代码:

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

Java 7开始,您还可以将所需的编码作为来自StandardCharsets的Charset常量传递给String构造函数。

这可能比将其他编码作为String传递更安全,如果您使用Java 7或更高版本,则应该这样做。

UTF-8编码示例

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

你可以试试这个

 String s = new String(bytearray); 
 public class Main { /** * Example method for converting a byte to a String. */ public void convertByteToString() { byte b = 65; //Using the static toString method of the Byte class System.out.println(Byte.toString(b)); //Using simple concatenation with an empty String System.out.println(b + ""); //Creating a byte array and passing it to the String constructor System.out.println(new String(new byte[] {b})); } /** * @param args the command line arguments */ public static void main(String[] args) { new Main().convertByteToString(); } } 

产量

 65 65 A 
 public static String readFile(String fn) throws IOException { File f = new File(fn); byte[] buffer = new byte[(int)f.length()]; FileInputStream is = new FileInputStream(fn); is.read(buffer); is.close(); return new String(buffer, "UTF-8"); // use desired encoding } 

我build议Arrays.toString(byte_array);

这取决于你的目的。 例如,我想保存一个字节数组,就像在debugging时可以看到的格式一样,如下所示: [1, 2, 3]如果要保存完全相同的值而不将字节转换为字符格式, Arrays.toString (byte_array)这样做。 但是如果你想保存字符而不是字节,你应该使用String s = new String(byte_array) 。 在这种情况下, s等于字符格式[1, 2, 3]

Andreas_D以前的回答很好。 我只是想补充一点,无论你在哪里显示输出,都会有一个字体和一个字符编码,它可能不支持一些字符。

要确定是Java还是显示是问题,请执行以下操作:

  for(int i=0;i<str.length();i++) { char ch = str.charAt(i); System.out.println(i+" : "+ch+" "+Integer.toHexString(ch)+((ch=='\ufffd') ? " Unknown character" : "")); } 

Java将已经将任何无法理解的字符映射到0xfffd未知字符的官方字符。 如果你看到一个'?' 在输出中,但它没有映射到0xfffd,它是你的显示字体或编码,这是问题,而不是Java。