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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将字节数组转换为String(Java)相关的知识,希望对你有一定的参考价值。

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

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

这是我现在唯一的问题:

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

智能引号在字节数组中以-108-109的形式返回。为什么这样,我如何解码负字节以显示正确的字符编码?

答案

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

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

按方式 - 原始字节出现可能显示为负小数,因为java数据类型byte已签名,它涵盖-128到127的范围。


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

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

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

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

Java 7及以上版本

您还可以将所需的编码作为StringCharset常量传递给StandardCharsets构造函数。这可能比将编码作为String更安全,如其他答案所示。

例如,对于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
}
另一答案

我建议Arrays.toString(byte_array);

这取决于你的目的。例如,我想保存一个字节数组,就像你在调试时看到的格式一样:[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。

以上是关于将字节数组转换为String(Java)的主要内容,如果未能解决你的问题,请参考以下文章

将字节数组转换为java类型

java里面byte数组和String字符串怎么转换

java将字节数组转换成string

如何把一个byte数组转化为字符串

java里面byte数组和String字符串怎么转换

如何把一个byte数组的数字转换成int