如何在考虑长度 > 1 的字符时比较字符串的每个字符?

How do I compare each character of a String while accounting for characters with length > 1?

我有一个可能包含任何 unicode 字符的可变字符串。这些 un​​icode 字符之一是 han </code>.</p> <p>问题是这个 "han" 字符有 <code>"".length() == 2 但在字符串中作为单个字符写入。

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

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

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

一个ASCII字符占Unicode字符的一半,所以汉字长度为2是合乎逻辑的。它不是ASCII字符,也不是Unicode字母。如果是第二种情况,该字母将正确显示。

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

查看字符串"code point"中的方法API:

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

通过代码点索引对字符串进行索引有点棘手,尤其是当字符串很长并且您想高效地进行索引时。不过还是可以的,就是代码比较繁琐

@sstan 的回答是一种解决方案。

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);
}

如果您将要搜索的字符串和数据都视为 String,这会更简单。如果您只需要测试该字符的存在:

if (string.contains("") {
    // do something here.
}

如果您特别需要该字符出现的索引:

int i = string.indexOf("");
if (i >= 0) {
    // do something with i here.
}

如果您确实需要遍历每个代码点,请参阅 How can I iterate through the unicode codepoints of a Java String?