Java 如何生成包含补充字符的随机Unicode字符串?

Java 如何生成包含补充字符的随机Unicode字符串?,java,unicode,surrogate-pairs,Java,Unicode,Surrogate Pairs,我正在编写一些生成随机字符串的代码。结果字符串似乎包含无效的char组合。具体地说,我发现高代理后面没有低代理 有人能解释为什么会这样吗?我是否必须显式生成一个随机低代理以跟随高代理?我假设这是不需要的,因为我使用的是Character类的int变体 下面是测试代码,在最近的一次运行中,它产生了以下错误配对: Bad pairing: d928 - d863 Bad pairing: da02 - 7bb6 Bad pairing: dbbc - d85c Bad pairing: dbc6 -

我正在编写一些生成随机字符串的代码。结果字符串似乎包含无效的
char
组合。具体地说,我发现高代理后面没有低代理

有人能解释为什么会这样吗?我是否必须显式生成一个随机低代理以跟随高代理?我假设这是不需要的,因为我使用的是
Character
类的
int
变体

下面是测试代码,在最近的一次运行中,它产生了以下错误配对:

Bad pairing: d928 - d863 Bad pairing: da02 - 7bb6 Bad pairing: dbbc - d85c Bad pairing: dbc6 - d85c 配对错误:d928-d863 配对错误:da02-7bb6 配对错误:dbbc-d85c 配对错误:dbc6-d85c
publicstaticvoidmain(字符串[]args){
随机r=新随机();
StringBuilder=新的StringBuilder();
整数计数=500;
而(计数>0){
int codePoint=r.nextInt(Character.MAX\u CODE\u POINT+1);
如果(!Character.isDefined(代码点)
||Character.getType(codePoint)=Character.PRIVATE\u使用){
继续;
}
建筑商。追加代码点(代码点);
计数--;
}
字符串结果=builder.toString();
//测试结果
char lastChar=0;
for(int i=0;i
可以随机生成高或低代理。如果这导致低代理项,或高代理项后面没有低代理项,则生成的字符串无效。解决方案是简单地排除所有代理:

if (!Character.isDefined(codePoint)
    || (codePoint <= Character.MAX_CHAR && Character.isSurrogate((char)codePoint))
    || Character.getType(codePoint) == Character.PRIVATE_USE) {
  continue;
}
(从技术上讲,您也可以允许随机生成高代理项并添加另一个随机低代理项,但这只会创建其他随机代码点>=0x10000,而这些随机代码点可能未定义或仅供私人使用。)

您需要排除所有代理项孤立项(即高代理项和低代理项)

仅供参考,下一段摘录显示了代理的代码点间隔:

if (!Character.isDefined(codePoint)
    || (codePoint <= Character.MAX_CHAR && Character.isSurrogate((char)codePoint))
    || Character.getType(codePoint) == Character.PRIVATE_USE) {
  continue;
}
D800;;反恐精英;0;LN
DB7F;;反恐精英;0;LN
DB80;;反恐精英;0;LN
DBFF;;反恐精英;0;LN
DC00;;反恐精英;0;LN
DFFF;;反恐精英;0;LN

Character.isDefined为代理项返回true。isSurrogate接受字符,而不是代码点。我不确定在这个阶段施展是否真的安全。
int type = Character.getType(codePoint);
if (type == Character.PRIVATE_USE ||
    type == Character.SURROGATE ||
    type == Character.UNASSIGNED)
    continue;