首先在java字符串中,大多数字符由一个代码单元表示,而辅助字符则需要一对代码单元表示,一个代码单元即16位。码点代表一个字符对应的值。
String类的length()方法返回的并不能代表字符串中字符的数量,而是代码单元的数量。在有辅助字符时两者是不一致的。
String str=“𝕆𝕆”;
int n=str.length(); // n=4
原因在于字符𝕆(U+1D546)需要两个代码单元\uD835和\uDD46
要想得到实际的字符长度,即码点数量,可以调用:
int cpCount=str.codePointCount(0,str.length()); // 2
该方法的第一个参数是起始下标,第二个是偏移量,该下标是与代码单元数量对应的,从0开始。例str的下标为0,1,2,3。偏移量也是代码单元的偏移。
charAt(n)方法返回下标n处的代码单元:
char a=str.charAt(0); //a=?
该处a显示?的原因在于,构成辅助字符的第一代码单元(U+D800~U+DBFF)和第二代码单元(U+DC00-U+DFFF)并不能单独表示字符。
要想得到第i个码点,可使用:
int index=str.offsetByCodePoints(0,1); // index=2
int index=str.offsetByCodePoints(1,1); // index=2
该方法第一参数为下标,第二参数为码点偏移量(并不是下标偏移),返回结果为从指定下标开始偏移的码点在字符串中的下标。注意****辅助字符对应两个下标,由第一个下标表示。
int cp=str.codePointAt(index); //cp=120134,即为U+1D546
该方法返回的是对应下标的码点值。
该结论为自己总结,欢迎探讨!