Core Java (八) Java中的代码点与代码单元

释放双眼,带上耳机,听听看~!

最近看core java,之前一直不明白,看了不少帖子和博客,总算搞明白了。

Java中,char[]、String、StringBuilder和StringBuffer类中采用了UTF-16编码,使用U+0000~U+FFFF来表示一个基本字符(BMP字符),但是位于U+D800到U+DBFF和U+DC00到U+DFFF的char被视为无定义字符。大多数的常用Unicode字符使用一个代码单元就可以表示,而辅助字符需要一对代码单元表示。即:
基本字符用一个ch
ar表示,辅助字符使用一对char表示。

Java使用
代码点(Unicode code pointer)这个概念来表示范围在U+0000与U+10FFFF之间的字符值(int型),
代码单元(Unicode code unit)表示作为UTF-16编码的代码单元的 16位char值(char型)。也就是说,可能存在一个字符,它的代码点数量是1,而代码单元数量是2。所以,代码单元的数量并不一定是字符的数量。

相比之下,
代码单元更加偏底层。

相关函数:

length()函数返回采用UTF-16编码标识的给定字符串所需要的
代码单元的数量。

codePointCount()函数返回采用UTF-16编码标识的给定字符串所需要的
代码点的数量。

测试程序:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
1package com.xujin;
2
3public class Test{
4   public static void main(String...args){    
5       char[] ch = Character.toChars(0x10400);
6        System.out.printf("U+10400 高代理字符: %04x\n", (int)ch[0]);//d801
7        System.out.printf("U+10400 低代理字符: %04x\n", (int)ch[1]);//dc00  
8        String str = new String(ch);
9        System.out.println("代码单元长度: " + str.length());//2
10        System.out.println("代码点数量: " + str.codePointCount(0, str.length()));//1
11      System.out.println(str.codePointAt(0));//返回给定位置开始或结束的代码点,66560
12      System.out.println(str.charAt(1));//返回给定位置的代码单元,由于未定义,返回?
13     
14      //遍历一个字符串,打印出所有字符的代码点
15      str += "Hello,world!";
16      int i = 0;
17      int cp = str.codePointAt(i);
18      while(i < str.length()){
19          System.out.println(str.codePointAt(i));
20          if(Character.isSupplementaryCodePoint(cp))
21              i += 2;//如果cp所在的位置是代码点的第一部分,执行此处
22          else i++;
23      }
24      /*
25       * 66560
26       * 72
27       * 108
28       * 111
29       * 119
30       * 114
31       * 100
32       */
33  }
34}
35

参考资料:

http://bbs.csdn.net/topics/340195349

http://blog.csdn.net/longyulu/article/details/7374862

给TA打赏
共{{data.count}}人
人已打赏
安全技术

详解Node.js API系列 Crypto加密模块(2) Hmac

2021-12-21 16:36:11

安全技术

从零搭建自己的SpringBoot后台框架(二十三)

2022-1-12 12:36:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索