在计算长度> 1的字符时,如何比较字符串的每个字符?

Fag*_*ack 16 java string unicode utf-16 character-encoding

我有一个可能包含任何unicode字符的变量字符串.其中一个unicode字符是汉.

The thing is that this "han" character has "".length() == 2但是作为单个字符写在字符串中.

考虑下面的代码,我如何迭代所有字符并比较每个字符,同时考虑它可能包含一个长度大于1的字符的事实?

for ( int i = 0; i < string.length(); i++ ) {
    char character = string.charAt( i );
    if ( character == '' ) {
        // Fail, it interprets as 2 chars =/
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:
这个问题不重复.这将询问如何迭代字符串的每个字符,同时考虑包含的.length() > 1字符(字符不是作为char类型而是作为书写符号的表示).这个问题不需要先前知道如何迭代Java String的unicode代码点,尽管提到的答案也可能是正确的.

sst*_*tan 11

int hanCodePoint = "".codePointAt(0);
for (int i = 0; i < string.length();) {
    int currentCodePoint = string.codePointAt(i);
    if (currentCodePoint == hanCodePoint) {
        // do something here.
    }
    i += Character.charCount(currentCodePoint);
}
Run Code Online (Sandbox Code Playgroud)

  • 很不幸的是,不行.``是一个有效的Unicode字符,但不能表示为单个Java`char`,这是你需要能够将它放在单引号中.如果你尝试,你会注意到你甚至无法编译它.java`char`只能表示代码为65,535的Unicode字符.过去,你需要2个代理`char`s来表示这个角色,或者只是使用`String`.非常讨厌,我同意. (2认同)

Ste*_*n C 9

String.charAtString.length方法治疗字符串作为UTF-16代码单元的序列.您希望将字符串视为Unicode代码点.

查看String API中的"代码点"方法:

  • codePointAt(int index) 返回给定代码单元索引处的(32位)代码点
  • offsetByCodePoints(int index, int codePointOffset)返回代码单元对应于codePointOffset代码点的代码单元索引index.
  • codePointCount(int beginIndex, int endIndex) 计算两个代码单元索引之间的代码点.

通过代码点索引索引字符串有点棘手,特别是如果字符串很长并且您想要有效地执行它.但是,它是可行的,尽管代码相当繁琐.

@sstan的答案是一个解决方案.