【问题标题】:Easiest way to convert an int (byte) to a single-character String in Java在 Java 中将 int(字节)转换为单字符字符串的最简单方法
【发布时间】:2014-12-22 09:43:46
【问题描述】:

我有一个 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 转换为单字符字符串。如果不是,我可能会使用上述两个中的第一个。

【问题讨论】:

  • (byte)myByte & 0xFF 中的 & 0xFF 是不必要的,至少有两个原因: 1. 你说过 myByte 包含一个有效的 UTF-8“字符”,根据定义意味着它不是超越0xFF;和 2. (byte)myByte 已经被截断为 8 位。
  • “我有一个 int (-> byte) 代表一个有效的 UTF-8 字符” UTF-8 没有 个字符,它有代码单元,其中一些本身是无效的。 UTF-8 中的 字符 长度可以是 1 到 4 个字节。见:unicode.org/faq/utf_bom.html

标签: java string casting character byte


【解决方案1】:

你不应该调用你的 int myByte;它实际上是一个 Unicode 代码点。

对你来说最简单的方法是使用Character.toChars():

final String s = new String(Character.toChars(theCodePoint));

它将处理每个代码点;之后就看你使用的字体是否有这个码位的字形了!

另请注意,UTF-8 是一种字符编码。事实上,您没有 UTF-8 字符之类的东西。

如需进一步查询,您可以查看CharsetEncoderCharsetDecoder 课程。

【讨论】:

    【解决方案2】:

    这个呢? .. 就像 TJ Crowder 所说,您不必将其转换为字节

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

    O/P : C

    【讨论】:

    • 仍然打印一个字符(它调用 println 的字符参数重载)。
    【解决方案3】:

    你可以在这里使用Character.toChars()

    例如:

    System.out.println(Character.toChars(67));
    

    输出:

    C
    

    【讨论】:

    • OP 说它是 UTF-8,而不是 UTF-16。 toChars 需要 UTF-16。但是就是说,如果它是单字节 UTF-8 字符之一,我 怀疑 将其扩大到 16 位会给您等效的单字 UTF-16 字符,但我不知道肯定的。
    • 是的,根据this listthis list,前128个(UTF-8中唯一的单字节图表)是相同的。
    • (“chars”不是“charts”,抱歉)
    【解决方案4】:
    int b = 67;
    String s = "" + (char)b;
    System.out.println(s);
    

    为我工作。

    【讨论】:

      【解决方案5】:

      首先,我们必须做出一个假设:您只处理 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 listthis list 证明前 128 个是相同的。

      基于以上,我们得到:

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

      这将调用Character.toString(char) 方法,将myByte 隐式转换为char,并返回一个包含一个字符的字符串,其值以UTF-16 解释。

      【讨论】:

        猜你喜欢
        • 2013-09-16
        • 2021-09-13
        • 1970-01-01
        • 1970-01-01
        • 2012-09-16
        • 2010-12-21
        • 2014-04-29
        • 2015-12-15
        • 1970-01-01
        相关资源
        最近更新 更多