当前位置:   article > 正文

码点(code point)和代码单元(code unit),以及String对象中操作码点和代码单元

码点

一个码点是信息原子的单元。文本是一连串的码点。每一个码点是一个由标准的Unicode编码规定的数字;
一个代码单元是一个用来存储编码码点的一部分的单元。在UTF-8中,一个代码单元是8位;在UTF-16中,一个代码单元是16位。
单独的一个代码单元可能代表一个完整的码点,也可能是一个码点的一部分。
例如,一个雪人字符(☃),是一个Unicode码点,也就是一个Unicode编码所代表的符号,在UTF-8中用3个代码单元表示,在UTF-16中用一个代码单元表示。

String对象中操作码点和代码单元

 

     length()方法是获取给定字符串所需的代码单元数量。charAt(i)方法是获取位置i的代码单元,i介于0~s.leng()-1之间。

     “?”符号 在Unicode中编码中,对应的十六进制编码为:1d546。“?”符号 在Java中的代码单元为:"\uD835\uDD46"。

  1. // 以此打印码点
  2. private static void showCodePoint(){
  3. //String str01="\u1D546";
  4. String str01="\uD835\uDD46";
  5. try {
  6. // 将Unicode字符转为UTF-8格式
  7. byte[] b = str01.getBytes("UTF-8");
  8. String rb = new String(b,"UTF-8");
  9. // 为rb拼接一些内容
  10. rb = rb+"abc";
  11. // 打印rb的内容
  12. System.out.println(rb);
  13. // 打印rb的代码单元长度
  14. System.out.println(rb.length());
  15. // 打印rb的码点长度
  16. int codePointLen = rb.codePointCount(0, rb.length());
  17. System.out.println(codePointLen);
  18. System.out.println("*******************");
  19. // 根据码点长度,遍历各个码点
  20. for(int i=0;i<codePointLen;i++){
  21. // 码点的偏移量
  22. int index = rb.offsetByCodePoints(0, i);
  23. System.out.println(index);
  24. // 码点的十进制表示
  25. int cp = rb.codePointAt(index);
  26. // 码点的十六进制表示
  27. String cpHex = Integer.toHexString(cp);
  28. System.out.println(cp+" , "+cpHex);
  29. }
  30. } catch (Exception e) {
  31. System.err.println(e);
  32. }
  33. }

上面的代码,打印出的结果如下:

?abc

5

4

*******************

0

120134 , 1d546

2

97 , 61

3

98 , 62

4

99 , 63

【正向操作】遍历一个字符串,并依次参看每一个码点:

  1. // 遍历一个字符串并查看每一个码点
  2. private static void printCodePoint(){
  3. String str01="\uD835\uDD46";
  4. String str02 = str01+"hello"+str01+"World";
  5. int i=0;
  6. // 判断i是否小于str02的代码单元长度
  7. while(i<str02.length()){
  8. System.out.println("i: "+i);
  9. // 码点的十进制表示
  10. int cp = str02.codePointAt(i);
  11. // 码点的十六进制表示
  12. String cpHex = Integer.toHexString(cp);
  13. System.out.println(cp+" , "+cpHex);
  14. // 判断是否为补充码点,如果是补充码点就加2,如果不是补充码点就加1
  15. if(Character.isSupplementaryCodePoint(cp)) i+=2;
  16. else i++;
  17. }
  18. }

【回退操作】从后往前操作,遍历字符串,并查看每一个码点

  1. // 从后往前操作,遍历字符串,并查看每一个码点
  2. private static void fromLastLoopCodePoint(){
  3. String str01="\uD835\uDD46";
  4. String str02 = str01+"hello"+str01+"World";
  5. // 代码单元的长度
  6. int codeUtilLen=str02.length();
  7. for(int i=codeUtilLen;i>0;){
  8. i--;
  9. if(Character.isSurrogate(str02.charAt(i))) i--;
  10. System.out.println("i: "+i);
  11. // 码点的十进制
  12. int cp = str02.codePointAt(i);
  13. //码点的十六进制
  14. String cpHex = Integer.toHexString(cp);
  15. System.out.println(cp+" , "+cpHex);
  16. }
  17. }

上面块代码打印的结果如下:

正向遍历                                回退操作
i: 0                                      i: 13
120134 , 1d546                            100 , 64
i: 2                                      i: 12
104 , 68                                  108 , 6c
i: 3                                      i: 11
101 , 65                                  114 , 72
i: 4                                      i: 10
108 , 6c                                  111 , 6f
i: 5                                      i: 9
108 , 6c                                  87 , 57
i: 6                                      i: 7
111 , 6f                                  120134 , 1d546
i: 7                                      i: 6
120134 , 1d546                            111 , 6f
i: 9                                      i: 5
87 , 57                                   108 , 6c
i: 10                                     i: 4
111 , 6f                                  108 , 6c
i: 11                                     i: 3
114 , 72                                  101 , 65
i: 12                                     i: 2
108 , 6c                                  104 , 68
i: 13                                     i: 0
100 , 64                                  120134 , 1d546

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/668162
推荐阅读
相关标签
  

闽ICP备14008679号