相同的字符串,不同的字符集,不等于

时间:2012-09-19 09:11:00

标签: java string ascii

我有一个奇怪的问题。

我有一个抓取网页的应用程序来获取名单。将此列表传递给使用这些名称的其他应用程序,使用其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?

2 个答案:

答案 0 :(得分: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]","");
}

答案 1 :(得分: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));

我举了几个例子。