我正在为自定义StringDatatype编写单元测试,我需要写下4字节的unicode字符。 “\ U” - 不工作(非法转义字符错误) 例如:U + 1F701(0xf0 0x9f 0x9c 0x81)。如何用字符串写出来?
答案 0 :(得分:15)
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
)。
答案 1 :(得分:5)
String s = "";
从技术上讲,这是一个字符。但是请注意s.length()
将返回2。而且Java不会编译String s = ''
。 Java不会向您保证String.length()
将返回准确的字符数,它只返回存储此字符串所需的Java字符数。
可以从s.codePointCount(0, s.length())
获得实际字符数。
答案 2 :(得分:0)
jshell>字符串s =“?”; s ==>“?️”
jshell> s.codePointCount(0,s.length()); $ 5 ==> 2