我的Java日记--Char

  • Java语言中的每一个 char 类型变量均为16-bit,对应于UTF-16编码中的一个 code unit(简称为CU)——即Java的 Char 类型变量完全遵循UTF-16编码规范,编码规范的详细解读见收藏夹中的《彻底搞懂字符编码》一文。
            因为1个CU可能对应一个Unicode表中的一个code point(简称CP,一个cp对应于一个真正的unicode字符),也可能仅仅只是表示一个CP的两个CU中的一个,所以Java中的一个 Char 类型变量并不一定就是代表一个字符
            在Java中表示一个char常量的时候,可以使用\u转义字符来表示一个CU——这里需要注意的是,使用\u来表示一个char常量的时候,必须使用四位的十六进制数。例如 '\u0012',这样才符合一个char类型变量必须为16-bit的要求。如果写成 '\u12',Java编译器将报错。而对于Unicode表中的supplement characters(即CP值大于0xFFFF),例如 U+12345,我们是不能直接用 '\u12345' 这样的形式来表示的,而必须遵循UTF-16编码规范,写成 '\uD808\uDF45'
            String对象的length()方法返回的是CU的个数,而codePointCount()方法返回的才是CP的格式,二者不一定相等。类似的charAt()方法中的index参数也是针对CU而言的,而codePoint()方法的index参数是针对CP而言的,后者index需要首先通过String对象的offsetByCodePoint()方法才能获取。offsetByCodePoints(int index, int codePointOffset) 两个参数的含义个人理解为:以第index个CU为起点的第 codePointOffset 个CP的第一个CU在String对象中的index。例如:String sentence = "\uD835\uDD6B\uD836\uDD6Cqq"; 
    • sentence.offsetByCodePoints(1, 0) 是指以第1个CU(\uDD6B)为起点的第0个CP,因为\uDD6B本身不是以D8开头的,所以\uDD6B自身就被当做一个独立的CP,因此返回值也就是1了;
    • sentence.offsetByCodePoints(1, 1) 是指以第1个CU(\uDD6B)为起点的第1个CP,即 '\uD836\uDD6C' 这一个code point,因为这个CP是由两个CU构成的,所以返回值就是 \uD836 这个CU的index,即2
    • sentence.offsetByCodePoints(2, 0)是指以第2个CU(\uD836)为起点的第0个CP,因为 \uD836 本身就是以D8开头的,所以对应的CP仍然是 '\uD836\uDD6C' 这一个code point,故而其返回值与 sentence.offsetByCodePoints(1, 1) 是一样的2
    • sentence.offsetByCodePoints(1, 2)是指以第1个CU(\uDD6B)为起点的第2个CP,对应的是'q'这个code point了,这个CP本身仅仅对应一个CU,所以返回值就是4了
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值