1

application/x-www-form-urlencoded データを Web サーバーに送信する必要があります。サーバーは、データが ISO-8859-1 を使用してエンコードされていることを想定しています。

残念ながらURLEncoder.encode(string, "ISO-8859-1"); 常に機能するとは限りません。

ISO-8859-1 の一部ではない文字は、%3F ('?') としてエンコードされます。

Firefox は、サーバー側で動作する別の方法でこれらの文字を処理します。

\uFEFF (Zero Width No-Break Space)は、まさに私が必要としている%26%2365279%3Bにエンコードされます。

この動作を模倣する方法/FFが何をするか教えてください。

4

1 に答える 1

1

私自身の質問に答えるには:

FF は、マップできない文字を 10 進数の HTML エンティティに変換し、文字セットを使用してそれらをエンコードします。

\uFEFF -> & #65279; (間のスペースは無視してください) -> %26%2365279%3B

( %26 = & | %23 = # | %3B = ; )

Java で最初のステップを実行するメソッドを次に示します。

public static String htmlEscapeUnmappableCharaters(String source, String charset) {
    CharsetEncoder cse = Charset.forName(charset).newEncoder();

    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < source.length(); i++) {

        if (cse.canEncode(source.charAt(i))) {
            sb.append(source.charAt(i));
        } else {
            sb.append('&');
            sb.append('#');
            sb.append(source.codePointAt(i));
            sb.append(';');
        }
    }

    return sb.toString();
}
于 2013-02-17T00:36:14.840 に答える