2017-07-16 2318 views
1

我想比较字符串部分(即字符)与中文字符。我假设由于Unicode编码它计为两个字符,所以我以两个增量循环字符串。现在我遇到了一个路障,我试图检测'儿'字符,但equals()不符合它,所以我错过了什么?这是代码片段:如何使用'equals()'比较Java中的中文字符

for (int CharIndex = 0; CharIndex < tmpChar.length(); CharIndex=CharIndex+2) { 

    // Account for 'r' like in dianr/huir 
    if (tmpChar.substring(CharIndex,CharIndex+2).equals("兒")) { 

而且,随意提出一个更优雅的方式来解析这个...

[更新]从调试器的一些照片,显示出它不即使应该,也不匹配。我粘贴从我作为输入使用电子表格中的中国人的性格,所以我不认为这是一个复制和粘贴的问题(除非统一被沿途丢失)

enter image description here

enter image description here

哦,宕,显然它不工作只是复制和粘贴:

enter image description here

+3

“我认为由于Unicode编码它算作两个字符”那么,为什么假设? '“儿”.toCharArray()。length()'告诉你明确的。 –

+1

'儿'是[Unicode汉字'儿子,孩子,自己; (U + 5152)](http://www.fileformat.info/info/unicode/char/5152/index.htm),即只有一个UTF-16'char',所以你的假设是错误的。 – Andreas

+0

好的,坏的措辞,它绝对是2个字符,我只是说我认为它是2个字符,因为它是unicode。这个脚本适用于我所做的音色,它只是失败了匹配。如果我进入调试器并在“if”中检查(...),它将返回为'false' – Mairyu

回答

0

使用CharSequence.codePoints(),返回码点流,而不是必须处理字符:

tmpChar.codePoints().forEach(c -> { 
    if (c == '兒') { 
    // ... 
    } 
}); 

(当然,您可以使用tmpChar.codePoints().filter(c -> c == '兒').forEach(c -> { /* ... */ }))。

+2

'儿'只是一个字符,在这种情况下你的代码编译,但使用代码点是不必要的,或者'儿'是两个代理字符,在这种情况下''儿''将无法编译。我的意思是,使用'codePoints()'是好的,但它并不是真正的答案。 – Andreas

0

任一字符,接受作为子字符串。

String s = ...; 
if (s.contains("兒")) { ... } 
int position = s.indexOf("兒"); 
if (position != -1) { 
    int position2 = position + "兒".length(); 
    s = s.substring(0, position) + "*" + s.substring(position2); 
} 
if (s.startsWith("兒", i)) { 
    // At position i there is a 兒. 
} 

或代码点,它将是一个代码点。由于这不是很容易,可变子串看起来很好。

0
if (tmpChar.substring(CharIndex,CharIndex+2).equals("兒")) { 

是你的问题。儿只有一个UTF-16字符。许多汉字可以用UTF-16以一个代码单元表示; Java使用UTF-16。但是,其他字符是两个代码单元。

String课程中有多种API用于应对。

正如另一个答案中所提供的,从codepoints获取IntStream可让您为每个字符获取32位代码点。您可以将其与您正在查找的角色的代码点值进行比较。或者,您可以使用ICU4J库和更丰富的设施来完成所有这些工作。