Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将补充Unicode字符放入字符串文字中?_Java_Unicode - Fatal编程技术网

Java 如何将补充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 但坏消息是,它没有正确打印(在我的软呢帽盒中)

如何将补充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

但坏消息是,它没有正确打印(在我的软呢帽盒中),我可以看到一个正方形而不是预期的符号(我的控制台没有正确支持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
。相关: