Java 如何将补充Unicode字符放入字符串文字中?
如何将补充Unicode字符(例如,代码点)放入字符串文字中? 我尝试过这样放置一对代理对象:Java 如何将补充Unicode字符放入字符串文字中?,java,unicode,Java,Unicode,如何将补充Unicode字符(例如,代码点)放入字符串文字中? 我尝试过这样放置一对代理对象: String text = "TEST \uD801\uDC00"; System.out.println(text); 但它似乎不起作用 更新: 好消息是,字符串构造正确。 UTF-8中的字节数组:54 45 53 54 20 f0 90 80 UTF-16中的字节数组:fe ff 0 54 0 45 0 53 0 54 0 20 d8 1 dc 0 但坏消息是,它没有正确打印(在我的软呢帽盒中)
String text = "TEST \uD801\uDC00";
System.out.println(text);
但它似乎不起作用
更新:
好消息是,字符串构造正确。UTF-8中的字节数组:54 45 53 54 20 f0 90 80
UTF-16中的字节数组:fe ff 0 54 0 45 0 53 0 54 0 20 d8 1 dc 0 但坏消息是,它没有正确打印(在我的软呢帽盒中),我可以看到一个正方形而不是预期的符号(我的控制台没有正确支持unicode)。“适合我”,到底是什么问题
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());
}
输出:
cp: 66560
found: 66560
len: 7
请注意,与大多数字符串方法一样,length处理的是char
s,而不是Unicode字符。非常棒的Unicode支持到此为止:)
快乐编码。它应该使用以下方式工作:
System.out.println(
"text = " + new String(Character.toChars(h))
);
但结果是:
text = ?
你说它似乎不起作用是什么意思?
text.charAt(5)
的值是多少?它无法正确打印符号。它可能与输出流有关。我相信“一个小方框”用于表示系统无法显示的字符。这可能只是意味着,在您试图查看输出的显示器中使用的字体没有为该字符提供字形。没错,我的控制台没有正确支持unicode。假设h是正确的:System.out
将数据编码为系统默认字符集(这可能是有损转换);您要写入的设备必须使用相同的字符集(不总是这样);该设备必须支持您要显示的图形。更不用说,如果我们谈论的是Windows控制台:当像Java一样使用stdio函数访问时,它已损坏,根本无法处理ANSI代码页以外的字符(更不用说来自星体平面的字符)。谢谢,输出流似乎有问题,因为我从text.getBytes()中得到的字节[]是正确的。@houman001请记住永远--除了我现在知道的那些情况;)--使用getBytes
:)指定编码,以免“使用平台的默认字符集将此字符串编码为字节序列”。新字符串(字节[])也有类似的情况。如果使用了正确的编码(指定或其他),则发送到流的输出应该是正确的:但另一端的程序(或终端)可能不一致。有趣的是text.length()
返回7。这意味着Java是按照16位UTF-16码点来思考的。所以我的经验法则是:尽管java称它为字符
类型,但它实际上是UTF16代码点
类型。当我们用0xFFFF下的Unicode码点表示字符时,它将与我们认为的字符是同义词。但是,如果我们想在java中用Unicode代码点U+10346
表示一个字符,那么包含它的字符串的长度将为2
(通过2个“代理”UTF16代码点
)。如果用ux10346.charAt(0)检查strings,则isSurrogate()
将返回true
。相关: