Java 有没有一个角色。托卡尔?
我知道我可以使用Character.toChars从代码点获取char[]。 到目前为止,我已经: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+
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
时,由于符号扩展,现有代码被破坏。感谢您的快速完整响应。我将不得不在一分钟内回到它,看看我需要做什么。我确实希望我的代码是健壮的,所以我一定会把你的评论放在心上。