3

我有一个奇怪的问题。

我有一个抓取网页以获取名称列表的应用程序。然后将该列表传递给使用这些名称的另一个应用程序,使用其 API 向站点请求信息。

当我将第一个网页中的某些字符串与 API 抓取的其他字符串进行比较时,通常会得到错误的结果。

我试图逐个字母地获取字符值我得到了这个:

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(不间断空格)而不是 32。

我可以正确编码第一组字符串吗?

我也尝试将 Charset 设置为 UTF-8,但没有成功。

也许我只需要将 160 替换为 32 ?

4

2 回答 2

2

我首先会修剪并替换字符串中的复杂字符以进行比较。在这一步之后是equals调用。如果您的文本中有特定语言的替换,这也带来了优势。将生成的字符串转换为小写也是一个好主意。

通常我使用类似的东西....

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]","");
}
于 2012-09-19T11:23:17.967 回答
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));

我得到了很多例子。

于 2012-09-19T09:20:28.230 回答