我有一个可能包含任何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代码点,尽管提到的答案也可能是正确的。
答案 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.charAt
和String.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字母。如果是第二种情况,则会正确显示该字母。