2017-07-16 2311 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庫和更豐富的設施來完成所有這些工作。