我有一个int( - >字节)表示有效的UTF-8
字符,我想在System.out.println
中打印这个单个字符。
我知道这两种方法可以将表示UTF-8字节的int转换为单字符字符串:
int myByte = ...; // For example 67
String sMyByte = String.valueOf((char)((byte)myByte & 0xFF)); // 67 will become "C"
String sMyByte = new String(new byte[]{ (byte)myByte }, StandardCharsets.UTF_8); // 67 will become "C"
两者看起来有点长/不可读,我想知道是否有更简单的方法将表示UTF-8字节的int转换为单字符String。如果不是,我可能会使用上述两个中的第一个。
答案 0 :(得分:5)
你不应该叫你的myByte
;它实际上是一个Unicode代码点。
最简单的方法是使用Character.toChars()
:
final String s = new String(Character.toChars(theCodePoint));
它将处理每个代码点;之后,它取决于您使用的字体是否具有此代码点的字形!
另请注意,UTF-8是字符编码。事实上,你没有UTF-8这样的角色。
如需进一步咨询,您需要查看CharsetEncoder
和CharsetDecoder
课程。
答案 1 :(得分:1)
这个怎么样? ..就像TJ Crowder说的那样,你不必把它转换成一个字节
public static void main(String[] args) {
int mByte = 67;
String s = String.valueOf((char)mByte);
System.out.println(s);
}
O / P:C
答案 2 :(得分:0)
答案 3 :(得分:0)
int b = 67;
String s = "" + (char)b;
System.out.println(s);
适合我。
答案 4 :(得分:0)
首先,我们必须做出一个假设:您只处理值0到127,因为这些是唯一可以由单个UTF-8代码单元(字节)表示的UTF-8字符。有关UTF-8和UTF-16 on the Unicode.org site的更多信息。
基于这个假设,我们依赖于前128个UTF-8代码单元(0x00 - 0x7F)与前128个UTF-16代码单元(0x0000 - 0x007F)完全对应的事实。因此,我们可以将您的输入视为UTF-16代码单元,这很重要,因为这是Java char
所代表的内容。 fileformat.info上的This list和this list证明了前128个是相同的。
基于以上所述,我们得到:
if (myByte < 0 || myByte > 0x7F) {
throw /*...relevant exception...*/;
}
String s = Character.toString(myByte);
这将调用Character.toString(char)
方法,隐式地将myByte
强制转换为char
,并返回包含一个字符的字符串,其值以UTF-16解释。