Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.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 String.codePointAt具体做什么?_Java_String_Unicode_Codepoint - Fatal编程技术网

Java String.codePointAt具体做什么?

Java String.codePointAt具体做什么?,java,string,unicode,codepoint,Java,String,Unicode,Codepoint,最近我在Java中遇到了String方法。我还发现了一些其他的代码点方法:codePointBefore,codePointCount等等。它们肯定与Unicode有关,但我不理解 现在我想知道什么时候以及如何使用codePointAt和类似的方法。简而言之,很少使用Java中的默认字符集:),但要获得更详细的解释,请尝试以下帖子: 希望这有助于您澄清问题:)简短回答:它提供了从字符串中指定索引开始的字符串。i、 e.该位置字符的“unicode编号” 更详细的回答:Java是在16位(也称

最近我在Java中遇到了String方法。我还发现了一些其他的代码点方法:
codePointBefore
codePointCount
等等。它们肯定与Unicode有关,但我不理解


现在我想知道什么时候以及如何使用
codePointAt
和类似的方法。

简而言之,很少使用Java中的默认字符集:),但要获得更详细的解释,请尝试以下帖子:


希望这有助于您澄清问题:)

简短回答:它提供了从
字符串中指定索引开始的字符串。i、 e.该位置字符的“unicode编号”

更详细的回答:Java是在16位(也称为
char
)足以容纳任何已存在的Unicode字符(这些部分现在称为Unicode)时创建的。后来,Unicode被扩展到包含代码点大于216的字符。这意味着
char
不能再保存所有可能的Unicode码点

解决方案是:它将“旧”Unicode码点存储在16位(即正好一个
char
),将所有新码点存储在32位(即两个
char
值)。这两个16位值称为“代理项对”。现在严格地说,
char
保存的是“UTF-16代码单元”,而不是过去的“Unicode字符”

现在,所有“旧”方法(仅处理
char
)都可以很好地使用,只要您不使用任何“新”Unicode字符(或不真正关心它们),但如果您也关心新字符(或只需要完全支持Unicode),则需要使用“代码点”实际上支持所有可能的Unicode代码点的版本


注意:BMP中没有的unicode字符的一个非常著名的例子(即,仅在使用代码点变体时才起作用)是表情符号:即使是简单的笑脸代码点也支持65535以上的字符,即Character.MAX_值

如果文本具有如此高的字符,则必须使用代码点或
int
而不是
char
s

它不支持UTF-16,UTF-16可以使用一个或两个16位字符并将其转换为
int


好的,一般来说,这只适用于最近添加的字符,如非繁体中文。

嗯,不仅仅是非繁体中文:许多鲜为人知的语言、一些数学符号、表情符号以及几乎所有最近引入Unicode的东西都不在BMP中。有一个问题。这些方法与字符集没有(直接)关系(除了我知道没有非通用的字符集编码BMP之外的任何东西)。你能提供一个例子,其中
charAt()
无法给出完整的代码点,但是
codePointAt()
会成功吗?对于Zaid Khan:String s3=“\u0041\u00DF\u6771\uD801\uDC00”;System.out.println(s3.charAt(3));System.out.println(s3.codePointAt(3));