Java 有没有一个角色。托卡尔?

Java 有没有一个角色。托卡尔?,java,character,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+

我知道我可以使用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。每次我搜索,我都会得到上面的东西。我希望有更干净的东西。

因为一个字符有16位,一个字节有8位,你可以简单地

buffer[i]=aByte

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

你为什么需要这种方法呢?为什么不干脆

新字符串(字节)

…或者更可取的是


新字符串(字节,someCharSet)

如果您打算使用Character类,那么您拥有的代码可能是您能找到的最好的代码。老实说,它看起来都没那么凌乱。我会说坚持下去

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

String(byte[] bytes, Charset charset)
像这样使用它:

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

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

您当前所做的是假设您有8位编码,并且假设每个8位值都可以转换为
int
,并且
int
将是正确的Unicode码点。因此,考虑“代码> 0xA1 >拉丁文-1“反转感叹号”字符会发生什么。它的Java字节值为十进制161-256==-105,当
字节
被加宽为
int
时为-105。但是作为一个
int
,它将为您提供
0xFFFFFFA1
。这不是合法的Unicode代码点,因此对
toChars
的调用应该抛出
IllegalArgumentException

好的,那么将
字节[]
转换为
字符[]
的正确方法是什么呢。。。假设字节是用拉丁语1编码的

简单地说:

String s = new String(bytes, "LATIN-1");
char[] chars = s.toCharArray();
既然你真的想把字符作为字符串。。。您可以这样做:

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

如果您知道编码的名称并且您的Java安装实现了它,那么这同样适用于各种其他字符编码。您还可以将编码作为
字符集
对象提供。

您到底想做什么?您知道,
byte
char
是两种不同的基本类型,原因是……实际上,当您将
字节
扩宽为
int
时,由于符号扩展,现有代码被破坏。感谢您的快速完整响应。我将不得不在一分钟内回到它,看看我需要做什么。我确实希望我的代码是健壮的,所以我一定会把你的评论放在心上。