如何在考虑长度 > 1 的字符时比较字符串的每个字符?
How do I compare each character of a String while accounting for characters with length > 1?
我有一个可能包含任何 unicode 字符的可变字符串。这些 unicode 字符之一是 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.charAt
和 String.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?。
我有一个可能包含任何 unicode 字符的可变字符串。这些 unicode 字符之一是 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.charAt
和 String.length
方法将字符串视为 UTF-16 代码单元的序列。您希望将字符串视为 Unicode 代码点。
查看字符串"code point"中的方法API:
codePointAt(int index)
returns 给定代码单元索引处的(32 位)代码点offsetByCodePoints(int index, int codePointOffset)
returns 代码单元索引对应于index
. 处代码单元的 codePointCount(int beginIndex, int endIndex)
计算两个代码单元索引之间的代码点。
codePointOffset
个代码点
通过代码点索引对字符串进行索引有点棘手,尤其是当字符串很长并且您想高效地进行索引时。不过还是可以的,就是代码比较繁琐
@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?。