3

Punycode でいくつかの Unicode URL をエンコードしようとしています。これらの URL には、ASCII 以外の文字を含むクエリ パラメータがあります。次に例を示します。

https://en.wiktionary.org/w/index.php?title=Clœlia&printable=yes

問題は、Java で実行しようとすると、結果の URL が間違っていることです。

String link = "https://en.wiktionary.org/w/index.php?title=Clœlia&printable=yes";
link = IDN.toASCII(link);

// -> link = http://en.wiktionary.org/w/index.xn--php?title=cllia&printable=yes-hgf

このようにすると、結果の文字列は異なりますが (理由はわかりません)、間違っています。

String link = "http://en.wiktionary.org/w/index.php?title=" + IDN.toASCII("Clœlia") + "&printable=yes";

// -> link = http://en.wiktionary.org/w/index.php?title=xn--cllia-ibb&printable=yes

Chrome からアドレスをコピーしてここに貼り付けると、必要な次の URL が表示されます。

https://en.wiktionary.org/w/index.php?title=Cl%C5%93lia&printable=yes

ここで何が間違っていましたか?

4

1 に答える 1

2

あなたが間違っていたのは、punycode を使用することです。Punycode は、URLのドメイン名部分を含むドメイン名にのみ使用されます。

クエリ パラメータ部分を含む URL の他の部分は、URL エンコーディングまたは URI エンコーディングとも呼ばれるパーセント エンコーディングを使用します。これが Chrome が行っていることです。これは非 ASCII Unicode 文字を UTF-8 でエンコードし、パーセント記号 (%) と 2 つの 16 進数を使用して ASCII の限られたサブセットにないすべてのオクテットをエンコードします。非 ASCII のために UTF-8 によって使用されるオクテット 80-FF は、常に % エンコードされます。正確には、通常、クエリパラメーター部分と他の部分は、HTML フォーム送信用に定義されたわずかなバリアントを使用することがありますapplication/x-www-form-urlencoded。これは、%20 の代わりにプラス記号 '+' としてスペースをエンコードします。これは、'+' が既に安全でないセットに含まれているため、%2B としてエンコードされるため、明確です。

Java での使用java.net.URLEncoder.encodejava.net.URLDecoder.decodeこのため。信頼できる結果を得るには、エンコーディング名が「UTF-8」の新しい 2 引数形式を使用してください。

于 2015-06-19T06:34:56.910 に答える