0

Apache commons の URLCodec を使用して「1º」などのデータをデコードしているときに、1 つの問題に直面しています。「1?」としてデコードされます。

この問題の解決策はありますか?

以下のコードを使用してみる前に:

String decodedData = new URLCodec().decode(data, "ISO-8859-1");

以下のコードも使用してみました。しかし、それは役に立ちませんでした。

String decodedData = new URLCodec().decode(data, "UTF-8");

4

1 に答える 1

2

ドキュメントによると、decode 関数は標準の URL を取り込み、そこから値をデコードすることです。www-form-urlencoded エンコードされた値には、指定された ASCII 値のセットのみを含めることができます。

あなたの質問は、www-form-urlencoded の有効な範囲にない文字を含む URL 値を送信していることを示唆しています。

答えは次のとおりです。適切に www-form-urlencoded されていない値をデコードしようとしており、それが問題の原因であると思います。

あなたが与えた値: 1º は数字の 1 で、その後に「男性序数指標」が続きます (この StackOverflow エントリを編集しても何も歪まないと仮定します)。男性序数インジケータは 10 進数値 186 で、16 進数値 00BA です。

その値をエンコードされていないデータとして開始すると仮定すると、この 2 文字シーケンスの www-form-urlencoded 値は、UTF-8 と ISO-8859-1 のどちらを使用するかによって異なります。それぞれのエンコードされたバージョンは次のとおりです。

unencoded value:                           1º
www-form-urlencoded using ISO-8859-1 is:   1%BA
www-form-urlencoded using UTF-8 is:        1%C2%BA

エンコードされたフォームを取得してデコーダーに渡すと、エンコードされていないフォームが返されます。ただし、エンコードされていないバージョンを取得してデコードしようとするとどうなるかについての定義はありません。定義されていないため、実際の実装と実際の結果は異なる場合があります。おそらく、無効なエンコーディングとして例外をスローする必要がありますが、それも保証されていません。

于 2013-02-14T07:48:28.257 に答える