在Java中将int(字节)转换为单个字符串的最简单方法

在Java中将int(字节)转换为单个字符串的最简单方法,java,string,casting,character,byte,Java,String,Casting,Character,Byte,我有一个int->byte代表一个有效的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 byt

我有一个int->byte代表一个有效的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转换为单个字符串。如果没有,我可能会使用上面两个选项中的第一个。

您可以在这里使用

例如:

输出:

C
你可以在这里用

例如:

输出:

C

这个怎么样。。正如TJ Crowder所说,您不必将其转换为字节

public static void main(String[] args) {
    int mByte = 67;
    String s = String.valueOf((char)mByte);
    System.out.println(s);
}

O/p:C

这个怎么样。。正如TJ Crowder所说,您不必将其转换为字节

public static void main(String[] args) {
    int mByte = 67;
    String s = String.valueOf((char)mByte);
    System.out.println(s);
}

O/p:C

您不应该调用int-myByte;它实际上是一个Unicode代码点

最简单的方法是使用Character.toChars:

它将处理每个代码点;之后,这取决于您使用的字体是否有此代码点的标志符号

还要注意,UTF-8是一种字符编码。实际上,您没有UTF-8字符


要进一步查询,您需要查看和类。

您不应该调用int-myByte;它实际上是一个Unicode代码点

最简单的方法是使用Character.toChars:

它将处理每个代码点;之后,这取决于您使用的字体是否有此代码点的标志符号

还要注意,UTF-8是一种字符编码。实际上,您没有UTF-8字符

如需进一步查询,请查看和类

对我有用


对我来说很有用。

首先,我们必须假设:您只处理0到127的值,因为这些是唯一可以由单个UTF-8代码单位字节表示的UTF-8字符。更多关于UTF-8和UTF-16的信息

基于该假设,我们依赖以下事实:前128个UTF-8代码单元0x00-0x7F与前128个UTF-16代码单元0x0000-0x007F完全对应。因此,我们可以将您的输入视为UTF-16代码单元,这一点很重要,因为这是Java的char表示的内容。并且在fileformat.info上证明前128个是相同的

基于以上,我们得到:

if (myByte < 0 || myByte > 0x7F) {
    throw /*...relevant exception...*/;
}
String s = Character.toString(myByte);

这将调用Character.toStringchar方法,将myByte隐式转换为char,并返回一个包含一个字符的字符串,该字符的值在UTF-16中解释。

首先,我们必须假设:您只处理0到127的值,因为这些是唯一可以由单个UTF-8代码单位字节表示的UTF-8字符。更多关于UTF-8和UTF-16的信息

基于该假设,我们依赖以下事实:前128个UTF-8代码单元0x00-0x7F与前128个UTF-16代码单元0x0000-0x007F完全对应。因此,我们可以将您的输入视为UTF-16代码单元,这一点很重要,因为这是Java的char表示的内容。并且在fileformat.info上证明前128个是相同的

基于以上,我们得到:

if (myByte < 0 || myByte > 0x7F) {
    throw /*...relevant exception...*/;
}
String s = Character.toString(myByte);

这将调用Character.toStringchar方法,隐式地将myByte转换为char,并返回一个包含一个字符的字符串,该字符的值在UTF-16中解释。

bytemyByte&0xFF中的&0xFF不必要,至少有两个原因:1。您已经说过myByte包含一个有效的UTF-8字符,根据定义,这意味着它不超过0xFF;二,。bytemyByte已经截断为8位。我有一个int->byte表示有效的UTF-8字符UTF-8没有字符,它有代码单元,其中一些本身无效。UTF-8中的字符长度可以是1到4个字节。请参阅:bytemyByte&0xFF中的&0xFF是不必要的,至少有两个原因:1。您已经说过myByte包含一个有效的UTF-8字符,根据定义,这意味着它不超过0xFF;二,。bytemyByte已经截断为8位。我有一个int->byte表示有效的UTF-8字符UTF-8没有字符,它有代码单元,其中一些本身无效。UTF-8中的字符长度可以是1到4个字节。看:它仍然打印一个字符,它调用println的char-param重载。它仍然打印一个字符,它调用println的char-param重载。OP说它是UTF-8,不是UTF-16。托查斯预计将使用UTF-16。但是也就是说,如果它是单字节UTF-8字符之一,我怀疑将其扩展到16位会得到等效的单字UTF-16字符,但我不确定。是的,根据和,UTF-8中的前128个唯一的单字节图表是相同的。字符不是图表,对不起,OP说它是UTF-8,不是UTF-16。托查斯预计将使用UTF-16。但也就是说,如果它是单字节UTF-8字符之一,我怀疑将其扩展到16位会得到等效的单字UTF-16字符,但我不确定。是的,手风琴
g到和,前128个UTF-8中唯一的单字节图表是相同的。对不起,字符不是图表