2012-09-19 142 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]",""); 
}