java字符串映射到unicode

java中使用UTF-16编码,每个char占16位。当我们调用String.length的时候获取到的是16位的char的数量,charAt也同理。而unicode最多可使用32位来编一个码,这时会出现一个unicode码(如emoji)占2个char的情况。

详见https://blog.csdn.net/thomashtq/article/details/39081233,其中高半区UTF-16和低半区UTF-16用来组成一个32位字符,下面要介绍的方法,原理也是通过比较char是否在这个范围内来判断是否是32位。

在有些情况下按照unicode码而不是java定义的char来对一个字符串进行解析是有意义的,java中也定义了相关的API:

(1)String.offsetByCodePoints(startPositon, offsetCount) = Character.offsetByCodePoints

第一个参数是起始点index of char,第二个参数是需要往后x个unicode码,返回值是index向后x个unicode码后到达的index of char。如果第一个参数index指向一个32位码的后一个char,也就是在这个码中间,那么剩下0.5也作为x中的一个来移动。

example:

设x为一个32位字符

Character.offsetByCodePoints(“哈”, 0, 1) = 1

Character.offsetByCodePoints(“x”, 0, 1) = 2

Character.offsetByCodePoints(“x”, 1, 1) = 2

(2)String.codePointCount(beginIndex, lengthOfChar) = Character.codePointCount

统计指定区域内unicode码的数量,里面的半个(如上面那个方法)算一个。

点赞