Java中的4字节unicode字符

Con*_*ine 8 java unicode

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

fge*_*fge 17

Unicode代码点不是4个字节; 它是一个整数(此时,范围从U + 0000到U + 10FFFF).

你的4个字节是(疯狂猜测)它的UTF-8编码版本(编辑:我是对的).

你需要这样做:

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

创建Java时,Unicode没有在BMP之外定义代码点(即U + 0000到U + FFFF),这就是为什么a char只有16位长(好吧,这只是猜测,但是我我想我离这里不远了;)从那时起,它必须适应......而BMP之外的代码点需要两个字符(一个主要的代理和一个尾随的代理--Java称这些分别是高和低代理).Java中没有字符文字允许直接在BMP之外输入代码点.

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

另见CharsetDecoderCharsetEncoder类.

另见String.codePointCount(),自Java 8起,String.codePoints()(继承自CharSequence).


小智 6

String s = "";

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

可以从获得真实字符数s.codePointCount(0, s.length())