如何比较字符串的每个字符,同时考虑长度为>的字符。 1?

时间:2015-06-07 03:40:30

标签: java string unicode character-encoding utf-16

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

问题是这个“汉字”字符有"".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类型,而是作为书写符号的表示)。这个问题不需要先前知道如何迭代Java String的unicode代码点,尽管提到的答案也可能是正确的。

4 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:9)

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

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

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

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

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

答案 2 :(得分:3)

如果您将要搜索的字符串和数据都视为// Create the actions var Exit = UIAlertAction(title: "Add Task", style: UIAlertActionStyle.Default) { UIAlertAction in let loginTextField = alertController.textFields![0] as! UITextField let inputText = loginTextField.text println("The input text is: \(inputText)") NSLog("OK Pressed") } ,则会更简单。如果您只是需要测试该角色的存在:

String

如果您特别需要该角色出现的索引:

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

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

答案 3 :(得分:-4)

ASCII字符占Unicode字符数量的一半,因此han字符长度为2是合乎逻辑的。它不是ASCII字符,也不是Unicode字母。如果是第二种情况,则会正确显示该字母。