我知道我可以使用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。每次我搜索我都得到我上面的东西。我希望有点清洁。
答案 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。但是int
为0xFFFFFFA1
提供了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);