3

奇妙な問題があります。

名前のリストを取得するために Web ページをクロールするアプリケーションがあります。このリストは、それらの名前を使用する別のアプリケーションに渡され、その API を使用してサイトに情報を要求します。

最初の Web ページの一部の文字列を、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

ご覧のとおり、最初の文字列では、スペースが 32 ではなく 160 (改行なしスペース) でコード化されています。

文字列の最初のセットを正しく体系化できますか?

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 に答える