2017-01-03 84 views
3

在我的Android應用程序中,我想比較一個utf-8字符串,例如「bãi」與字符串哪個用戶類型在edittext上。
不過,如果我輸入「李白」到EDITTEXT和使用方法edittext.getText()獲取輸入字符串。的toString(),它會返回字符串像input stringAndroid比較UTF-8字符串與UTF-8輸入字符串edittext

,它會不等於「李白」

我也嘗試

String input = new String(input.getBytes("UTF-8"), "UTF-8"); 

,但它不能正常工作。 input.equals(「bãi」)將返回false。

有人知道如何解決這個問題。 感謝您的幫助。

+0

此問題不是http://stackoverflow.com/questions/8854106/java-string-encoding-utf-8的副本。它以「ã」的表示爲中心,可能在第一種情況下作爲單個Unicode代碼點(U + 00E3)給出,在第二種情況下作爲兩個單獨的代碼點(U + 0061和U + 0303)給出。 – Codo

+0

在比較它們之前,先對字符串進行標準化。這應該消除與組合字符相關的差異。請參閱[Normalizer](https://developer.android.com/reference/java/text/Normalizer.html)。 – Codo

+1

@IntelliJAmiya:請重新提問。這不是重複的,因爲您仔細閱讀時會看到它。 – Codo

回答

1

在Unicode中,某些字符可以用多種方式表示。例如,在單詞BAI中間字符可以以兩種方式表示:

  1. 單個碼點U + 00E3(WITH TILDE拉丁小寫字母A)
  2. 兩個編碼點U + 0061(拉丁小字母A)和U + 0303(組合TILDE)

對於顯示,兩者應該看起來相同。

對於字符串比較,這提出了一個問題。解決方法是根據Unicode Standard Annex #15 — Unicode Normalization Forms首先對字符串進行標準化。

通過Normalizer class(Android請參閱Normalizer)在Java(包括Android)中支持標準化。

下面的代碼示出了結果:

String s1 = "b\u00e3i"; 
String s2 = "ba\u0303i"; 
System.out.println(String.format("Before normalization: %s == %s => %b", s1, s2, s1.equals(s2))); 

String n1 = Normalizer.normalize(s1, Form.NFD); 
String n2 = Normalizer.normalize(s2, Form.NFD); 
System.out.println(String.format("After normalization: %s == %s => %b", n1, n2, n1.equals(n2))); 

它輸出:

Before normalization: bãi == bãi => false 
After normalization: bãi == bãi => true 

順便說一句:表單Form.NFD分解字符串,即它產生具有兩個編碼點的時間越長表示。 Form.NFC會創建較短的表單。

+0

感謝Codo的詳細答案。它解決了我的問題。 – hauca