Java中的4字节unicode字符

时间:2014-12-04 06:03:05

标签: java unicode

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

3 个答案:

答案 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" - 或者如果您的计算环境支持它,则直接作为符号。

另请参阅CharsetDecoderCharsetEncoder类。

另请参阅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