`

获取字符长度的正确姿势

 
阅读更多
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的情况)做了修正的

0
1
分享到:
评论

相关推荐

    常见的VC获取字符串长度的方法[定义].pdf

    常见的VC获取字符串长度的方法 在软件开发中,获取字符串长度是一个常见的操作,但是字符串长度的定义并不唯一,通常是指字符串中包含字符的数目,但有的时候人们需要的是字符串所占字节的数目。下面将介绍五种常见...

    截取指定长度的字符串

    1. 固定位置截取:这种方法通常基于起始位置和结束位置来获取字符串的一部分。例如,在Python中,你可以使用切片操作符`[start:end]`来截取字符串,其中`start`是开始索引,`end`是结束索引(不包括该位置的字符)。...

    常见的获取字符串长度的方法

    本文将详细介绍几种常用的获取字符串长度的方法,包括这些方法的工作原理、适用场景以及潜在的限制。 ### 一、使用`sizeof`获取字符串长度 `sizeof`运算符是一种基本的C/C++语法,用于计算数据类型或变量的字节数...

    JS获取带中文字符的字符串长度

    一个JS函数,可以获取你当前输入的字符串的长度,其中中文字符和全角字符是2个长度

    pb中实现字符长度和计算器的实现

    ",你可以使用`Len(str)`来获取这个字符串的长度,结果将是13。 现在让我们转向计算器的实现。在PowerBuilder中,你可以构建一个用户界面(UI),包含数字按钮、运算符按钮、输入框以及等于按钮等。用户通过点击...

    mysql获取字符串长度函数(CHAR_LENGTH)

    length: 是计算字段的长度一个汉字是算三个字符,一个数字或字母算一个字符CHAR_LENGTH(str) 返回值为字符串str 的长度,长度的单位为字符。一个多字节字符算作一个单字符。对于一个包含五个二字节字符集, LENGTH()...

    验证字符长度

    对于每个匹配到的字符,将被替换为两个星号 `"**"`,这样就可以通过 `.length` 属性来正确计算包含中文字符的字符串长度。 ```javascript var length = obj.value.replace(/[^\x00-\xff]/g, "**").length; ``` ...

    字符串长度计算器

    汉化软件好多地方必须设置字符串长度值,不设置正确功能就失效,所以这小工具,希望对大家有帮助。 功能用途:计算字符串的长度,并以十六进制显示 什么是Hex反序:比如说字符长度是 0123,在文件中实际上是 2301

    字符串长度的判断 JAVA

    要获取字符串的长度,可以调用`length()`方法。这个方法返回字符串中字符的数量,不包括任何末尾的空格。对于`panduan`,`length()`方法将返回2,因为"你好"中有两个字符。 ```java int length = panduan.length();...

    C语言程序设计-分别统计字符串中字母、数字、空格和其他字符出现的次数(字符长度小于80);.c

    C语言程序设计-分别统计字符串中字母、数字、空格和其他字符出现的次数(字符长度小于80);.c

    C++中可正确获取UTF-8字符长度的函数分享

    在C++编程中,处理UTF-8编码的字符串时,我们常常需要知道每个UTF-8字符的长度,因为UTF-8编码的字符长度不是固定的,可以从1到4个字节不等。这个问题的关键在于理解UTF-8编码的规则。UTF-8是一种变长的字符编码,它...

    C#获取字符串的字节数

    这里假设系统默认编码能够正确处理中文字符,实际上一个中文字符通常会占用2个字节。 3. **限制输入**:如果当前文本的字节数超过了218,则阻止新的字符输入。这是因为根据规则,最多允许输入218个英文字符或109个...

    泰国文字字符位长度算法

    泰国文字字符位长度算法。泰文的特殊显示方式使其字符位长度无法有效确定。

    pb字符串长度格式化

    "pb字符串长度格式化"这个主题关注的是如何调整字符串的长度,使其符合特定的标准,这通常涉及到字符串的截取、填充以及转换等操作。在编程语言如PowerBuilder(PB)中,这类操作对于数据展示、数据库交互以及遵循...

    监听edittext输入的字符长度并进行相应处理

    本文将详细介绍如何监听`EditText`输入的字符长度,并根据需要进行相应的操作。 首先,我们需要在布局文件中定义一个`EditText`,并为其设置一个`TextWatcher`监听器。`TextWatcher`是Android提供的一个接口,它...

    sqlldr报超出字符长度错误

    ### SQL*Loader 超出字符长度错误解析与解决方案 #### 概述 在使用SQL*Loader工具导入数据时,可能会遇到超出字符长度限制的错误。这类问题通常出现在需要将包含较长字符串的数据加载到表中时,而目标列定义的长度...

    文本框指定字符串长度

    然而,在实际应用中,我们往往需要对用户输入的字符长度进行限制,以符合业务需求或者保证数据格式的正确性。标题“文本框指定字符串长度”和描述“ios限制uitextfield字符长度”所指的就是如何在iOS中设置`...

    c#截取指定长度,中英文混合字符串

    这里的关键在于如何正确地处理中文字符的长度计算问题。 ##### 正则表达式使用 方法中使用了正则表达式 `Regex.Replace(temp, "[\u4e00-\u9fa5]", "zz", RegexOptions.IgnoreCase)` 来替换所有中文字符。其中,`[\...

    JSP 中限定字符长度

    具体来说,`fn:length()`函数用于获取字符串长度,而`fn:substring()`函数则用来截取字符串的一部分。 #### 3. 示例代码解析 下面的代码片段展示了如何使用JSTL来限制JSP页面中某个字段的显示长度: ```jsp ...

    vbs字符串长度脚本

    vbs字符串长度脚本,解决中文长度计算,多用于QTP自动化测试

Global site tag (gtag.js) - Google Analytics