2012-09-19 143 views
3

我有一個奇怪的問題。相同的字符串,不同的字符集,不等於

我有一個應用程序,爬網頁獲得名單的名單。比這個列表傳遞給使用這些名稱的另一個應用程序,使用它的API向站點索要信息。

當我比較第一個網頁中的某些字符串與API抓取的其他字符時,我通常會得到錯誤的結果。

我試圖通過信我這得到字符值信:不是32

Rocco De Nicola 
82 111 99 99 111 160 68 101 32 78 105 99 111 108 97 1st web page 
82 111 99 99 111 32 68 101 32 78 105 99 111 108 97 2nd 

正如你所看到的,第一個字符串中的空間被160(不間斷空格)編纂

我可以正確地編寫第一組字符串嗎?

我也嘗試將字符集設置爲UTF-8,但它沒有奏效。

也許我只需要將160替換爲32?

回答

0

使用蠻力。這列出了編碼時將160到32的所有字符集。

String s = "" + (char) 160; 
for (Map.Entry<String, Charset> stringCharsetEntry : Charset.availableCharsets().entrySet()) { 
    try { 
     ByteBuffer bytes = stringCharsetEntry.getValue().encode(s); 
     if (bytes.get(0) == 32) 
      System.out.println(stringCharsetEntry.getKey()); 
    } catch (Exception ignored) { 
    } 
} 

什麼都不打印。

如果我改變條件

if (bytes.get(0) != (byte) 160) 
    System.out.println(stringCharsetEntry.getKey()+" "+new String(bytes.array(), 0)); 

我得到了不少例子。

2

我會首先修剪並替換字符串中的複雜字符進行比較。在這個步驟之後跟着等號召。如果您在文本中進行語言特定替換,這也帶來了優勢。將結果字符串轉換爲小寫也是一個好主意。

通常我用類似的東西....

private String removeExtraCharsAndToLower(String str) { 
    str=str.toLowerCase(); 
    str=str.replaceAll("ä", "ae"); 
    str=str.replaceAll("ö", "oe"); 
    str=str.replaceAll("ü", "ue"); 
    str=str.replaceAll("ß", "ss"); 
    return str.toLowerCase().replaceAll("[^a-z]",""); 
}