public static void main(String[] args) throws UnsupportedEncodingException {
String a="\uD864\uDD00";
System.out.println(a.length()); //结果是2
System.out.println(a.codePointCount(0, a.length())); //结果是1 这个才要正确姿势
System.out.println(a.getBytes("utf8").length); //结果是4
}
这里的\uD864\uDD00 ,对应的中文是参照https://segmentfault.com/q/1010000003757947
length 为什么会不对呢,length其实是char数组的长度。char是16位,最多也就是能表示65536个字符,中文都不只65536个,所以一个char是表示不了一个中文的。
更具体来说,char是 UTF-16 编码的结果,UTF-16其实也是变长的,一个到两个字符,有的时候会两个char表示一个字符
有的人说可以用getBytes("utf8"),这个也是很不靠谱的,虽然多数中文的结果都是3,但是有少部分是4的。对于非中文更加可能是1或者2
所以获取字符个数应该用codePointCount。
这UTF-16的编码规则,超出一个char的时候,是有特殊表示的,
具体地说保留了 D800-DFFF 共 2048 个位置:
D800-DBFF为高位 1024
DC00-DFFF 为地位 1024
1024*1024 = 一百万 够用了
static int codePointCountImpl(char[] a, int offset, int count) {
int endIndex = offset + count;
int n = count;
for (int i = offset; i < endIndex; ) {
if (isHighSurrogate(a[i++]) && i < endIndex &&
isLowSurrogate(a[i])) {
n--; //这里是重点,有高地位的时候减1,做了修正
i++;
}
}
return n;
}
public static boolean isHighSurrogate(char ch) {
// Help VM constant-fold; MAX_HIGH_SURROGATE + 1 == MIN_LOW_SURROGATE
return ch >= MIN_HIGH_SURROGATE && ch < (MAX_HIGH_SURROGATE + 1);
}
public static final char MIN_HIGH_SURROGATE = '\uD800';
public static final char MAX_HIGH_SURROGATE = '\uDBFF';
可以看到codePointCount 的原理其实就是对于UTF-16的高地位(两个char的情况)做了修正的
分享到:
相关推荐
This is a bat file that can get a string length, and without using any other tools, it can make this happen by windows dos command only. Usage: stringlen.bat 1234567890 return:StringLenth=10 ...
一个JS函数,可以获取你当前输入的字符串的长度,其中中文字符和全角字符是2个长度
这是我做C++项目是碰到的一些字符串方面的问题,将其总结归纳一下,希望对你有所帮助! 字符串的长度通常是指字符串中包含字符的数目,但有的时候人们需要的是字符串所占...常见的获取字符串长度的方法包括如下几种。
java获取字符串长度,长度不够补相应的字符串
获取中文字符串长度的函数(VB6.0源代码编写)获取中文字符串长度的函数,输入汉字,计算机将会计算汉字长度Function CLen(ByVal mystr As String) As Integer
TIA博途WINCC的触摸屏VB脚本入门(Len函数获取字符串长度以及Right和Left函数)
自己输入一个字符串,字符串中可以包括字符和汉字,截取指定的字符串
常见的VC获取字符串长度的方法[定义].pdf
用指针计算字符串长度,简单的小程序,c语言
汉化软件好多地方必须设置字符串长度值,不设置正确功能就失效,所以这小工具,希望对大家有帮助。 功能用途:计算字符串的长度,并以十六进制显示 什么是Hex反序:比如说字符长度是 0123,在文件中实际上是 2301
初学者pb实现测字符长度 和计算器的实现 初学者很好的学习资源
C语言程序设计-分别统计字符串中字母、数字、空格和其他字符出现的次数(字符长度小于80);.c
C#字符串截取固定长度的方法
C语言写的一些字符串处理函数,包括连接,查找重复字符和获取字符串长度
主要介绍了C++中可正确获取UTF-8字符长度的函数分享,需要的朋友可以参考下
这个代码可以计算字符串数组中每个字符串的长度,并找出其中最长的字符串长度。具体来说,它首先创建了一个包含5个字符串的字符串数组`strArray`,然后使用`length()`函数计算每个字符串的长度,并将结果存储在向量`...
Python提供了len()函数来获取字符串的长度,该函数的语法如下: len(s) 其中,s是要获取长度的字符串。例如,我们可以使用以下代码来获取字符串"Hello World"的长度: s = "Hello World" print(len(s)) 输出结果为11...
获取中文字符串长度的函数(VB6.0代码编写) 获取中文字符串长度的函数,输入汉字,计算机将会计算汉字长度 QQ223857666勾月
Js验证字符长度
length: 是计算字段的长度一个汉字是算三个字符,一个数字或字母算一个字符CHAR_LENGTH(str) 返回值为字符串str 的长度,长度的单位为字符。一个多字节字符算作一个单字符。对于一个包含五个二字节字符集, LENGTH()...