如何在字符串文字中添加补充Unicode字符?

n0r*_*m1e 18 java unicode

如何在字符串文字中添加补充Unicode字符(例如,代码点10400)?我试过像这样放一个代理对:

String text = "TEST \uD801\uDC00";
System.out.println(text);
Run Code Online (Sandbox Code Playgroud)

但它似乎没有用.

更新:

好消息是,字符串构造正确.
UTF-8中的字节数组:54 45 53 54 20 f0 90 90 80
UTF-16中的字节数组:fe ff 0 54 0 45 0 53 0 54 0 20 d8 1 dc 0

但坏消息是,它打印不正确(在我的Fedora框中),我可以看到一个正方形而不是预期的符号(我的控制台不能正确支持unicode).

小智 15

"为我工作",究竟是什么问题?

public static void main (String[] args) throws Exception {
    int cp = 0x10400;
    String text = "test \uD801\uDC00";
    System.out.println("cp:    " + cp);
    System.out.println("found: " + text.codePointAt(5));
    System.out.println("len:   " + text.length());
}
Run Code Online (Sandbox Code Playgroud)

输出:

cp:    66560
found: 66560
len:   7
Run Code Online (Sandbox Code Playgroud)

请注意,长度 - 与大多数String方法一样 - 处理chars,而不是Unicode字符.非常棒的Unicode支持:)

快乐的编码.

  • @ houman001记得*总是* - 除了那些我现在知道的情况;) - 用`getBytes`指定编码:)以免它"使用平台的默认字符集*将此字符串编码为字节序列***".类似地适用于`new String(byte [])`.如果使用(指定或其他)正确的编码,则发送到流的输出应该是正确的:但是另一方的程序(或终端)可能不一致. (2认同)

Bor*_*vić 5

它应该使用:

System.out.println(
    "text = " + new String(Character.toChars(h))
);
Run Code Online (Sandbox Code Playgroud)

但输出是:

text = ?
Run Code Online (Sandbox Code Playgroud)

  • 更不用说如果我们谈论的是Windows控制台:当使用stdio函数作为Java访问时,它已被破坏,根本无法处理ANSI代码页之外的字符(更不用说来自Astral Planes的字符). (4认同)
  • 假设h是正确的:`System.out`将数据编码到系统默认字符集(这可能是有损转换); 您要写入的设备必须使用相同的字符集(并非总是如此); 设备必须具有您要显示的字素的字体支持. (3认同)