有没有Character.toChar?

时间:2015-07-23 12:57:13

标签: java character

我知道我可以使用Character.toChars从代码点获取char []。 到目前为止,我有:

public static String bytesToString(byte[] bytes) {
    char[] buffer = new char[bytes.length];
    int i = 0;
    for (byte aByte : bytes) {
        buffer[i] = Character.toChars(aByte)[0];
        i++;
    }
    return new String(buffer);
}

它有效。但我宁愿跳过char []并直接去char。每次我搜索我都得到我上面的东西。我希望有点清洁。

3 个答案:

答案 0 :(得分:1)

如果您打算使用Character类,那么您所拥有的代码可能是最好的代码。老实说 - 它看起来并不那么混乱。我说坚持下去。

然而,整个方法是不必要的。 String类有一个构造函数,您可以在其中将字节数组转换为String。

String(byte[] bytes, Charset charset)

像这样使用:

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

答案 1 :(得分:1)

呃...这就是问题所在。您当前的代码可能已损坏。它适用于以ASCII编码的文本,但对于大多数编码,您可能会出现乱码或异常。

您目前正在做的是假设您有8位编码,并假设每个8位值都可以转换为int并且int将是正确的Unicode代码点。因此,请考虑0xA1 - LATIN-1“倒置感叹号”字符会发生什么。其Java字节值为十进制161 - 256 == -105,当byte扩展为int时为-105。但是int0xFFFFFFA1提供了toChars。这不是合法的Unicode代码点,因此对IllegalArgumentException的调用应抛出byte[]

好的,那么将char[]转换为String s = new String(bytes, "LATIN-1"); char[] chars = s.toCharArray(); 的正确方法是什么?假设字节是在LATIN-1中编码的?

简单地说:

return new String(bytes, "LATIN-1");

因为你真的希望角色成为一个字符串......你可以这样做:

Charset

如果您知道编码的名称并且Java安装实现了它,那么它将适用于各种其他字符编码。您还可以将编码提供为x = "\\" + a + b + c对象。

答案 2 :(得分:0)

由于char有16位且一个字节有8位,所以你可以简单地...

buffer[i] = aByte;

Character.toChars无论如何都需要一个整数,因为字节不足以识别每个Unicode字符。我希望你意识到你的方法只适用于8位文本吗?一旦您尝试以这种方式读取unicode文本,您将遇到问题,因为unicode字符可能需要正确识别多个字节...

为什么你还需要这种方法?为什么不简单......

new String( bytes );

......甚至最好......

new String(bytes, someCharSet);