【问题标题】:4 byte unicode character in JavaJava中的4字节unicode字符
【发布时间】:2014-12-04 06:03:05
【问题描述】:

我正在为我的自定义 StringDatatype 编写单元测试,我需要写下 4 字节的 unicode 字符。 "\U" - 不工作(非法转义字符错误) 例如:U+1F701 (0xf0 0x9f 0x9c 0x81)。怎么写成字符串?

【问题讨论】:

    标签: java unicode


    【解决方案1】:

    Unicode 代码点不是 4 个字节;它是一个整数(目前范围从 U+0000 到 U+10FFFF)。

    您的 4 个字节是(疯狂猜测)它的 UTF-8 编码版本(编辑:I was right)。

    你需要这样做:

    final char[] chars = Character.toChars(0x1F701);
    final String s = new String(chars);
    final byte[] asBytes = s.getBytes(StandardCharsets.UTF_8);
    

    创建 Java 时,Unicode 没有定义 BMP 之外的代码点(即 U+0000 到 U+FFFF),这就是为什么 char 只有 16 位长的原因(好吧,这是只是一个猜测,但我认为我在这里并不遥远);从那时起,它不得不适应...... BMP 之外的代码点需要两个字符(一个前导代理和一个尾随代理——Java 分别称它们为高代理和低代理)。 Java 中没有字符文字允许直接在 BMP 之外输入代码点。

    鉴于 char 实际上是一个 UTF-16 代码单元,并且存在 字符串文字,您可以在字符串中输入此“字符”为 "\uD83D\uDF01" -- 或者如果您的计算环境支持,则直接作为符号。

    另请参阅 CharsetDecoderCharsetEncoder 类。

    另请参见 String.codePointCount(),以及,自 Java 8 起,String.codePoints()(继承自 CharSequence)。

    【讨论】:

    • 是的。这是 C 更聪明的少数几个方面之一。 sizeof(wchar_t) == 4 在我的机器上。
    • 感谢 fge。你的解决方案非常适合我。
    • @ChristianHujer:请记住,并非所有 C 编译器都有 sizeof(wchar_t) == 4,有些有 sizeof(wchar_t) == 2
    【解决方案2】:

    String s = "?";

    从技术上讲,这是一个字符。但要小心s.length() 将返回 2。java 也不会编译String s = '?'。 Java 不向您保证String.length() 将返回确切的字符数,它只返回存储此字符串所需的 java-chars 数。

    可从s.codePointCount(0, s.length())获取实际字符数。

    【讨论】:

      【解决方案3】:

      jshell> String s = "?"; s ==> “?️”

      jshell> s.codePointCount(0, s.length()); $5 ==> 2

      【讨论】:

      • 嗨!请拨打tour。感谢您为 Stack Overflow 做出贡献,但您能否添加关于您的代码如何解决问题的说明?查看help center 获取有关代码格式化的帮助。
      猜你喜欢
      • 1970-01-01
      • 2019-08-28
      • 2012-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-22
      • 2012-04-08
      • 2012-03-20
      相关资源
      最近更新 更多