【发布时间】:2014-12-04 06:03:05
【问题描述】:
我正在为我的自定义 StringDatatype 编写单元测试,我需要写下 4 字节的 unicode 字符。 "\U" - 不工作(非法转义字符错误) 例如:U+1F701 (0xf0 0x9f 0x9c 0x81)。怎么写成字符串?
【问题讨论】:
我正在为我的自定义 StringDatatype 编写单元测试,我需要写下 4 字节的 unicode 字符。 "\U" - 不工作(非法转义字符错误) 例如:U+1F701 (0xf0 0x9f 0x9c 0x81)。怎么写成字符串?
【问题讨论】:
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" -- 或者如果您的计算环境支持,则直接作为符号。
另请参阅 CharsetDecoder 和 CharsetEncoder 类。
另请参见 String.codePointCount(),以及,自 Java 8 起,String.codePoints()(继承自 CharSequence)。
【讨论】:
sizeof(wchar_t) == 4 在我的机器上。
sizeof(wchar_t) == 4,有些有 sizeof(wchar_t) == 2。
String s = "?";
从技术上讲,这是一个字符。但要小心s.length() 将返回 2。java 也不会编译String s = '?'。 Java 不向您保证String.length() 将返回确切的字符数,它只返回存储此字符串所需的 java-chars 数。
可从s.codePointCount(0, s.length())获取实际字符数。
【讨论】:
jshell> String s = "?"; s ==> “?️”
jshell> s.codePointCount(0, s.length()); $5 ==> 2
【讨论】: