2017-07-04 10 views
0

私はポストリクエストのためにデータを渡すために変換する必要のあるユニコードのタイプを理解するのに苦労しています。主に中国語の文字です。UTFエンコーディングのタイプを識別するための助けが必要

例文字列:

的事故事务院治党派驻地是不是

期待ユニコード:% u7684%u4E8B%u6545%u4E8B%u52A1%u9662%u6CBB%u515A%u6D3E% u9A7B%u5730%u662F%u4E0D%u662F

をにエンコードしようとした

UTF16-BE: %76%84%4E%8B%65%45%4E%8B%52%A1の%5C%40%5C %40%95%7F%67%1F%8D%27%7B%49%5F%85%62%08%59%1A

UTF-16でエンコードされたテキスト:%FF%FE%84%76%8B%4E%45%65%8B%4E%A1%52%62%96%BB%6C%5A%51% 3E%6Dの%7B%9Aの%30%57%2F%66%0D%の4E%の2Fの%66

UTF-8でエンコードされたテキスト:% E7の%9Aは%84%E4%でのBAの%8B%のE6 E95%85%E4%BA%8B%E5%8A%A1%E9%99%A2%E6%B2%BB%E5%85%9A%E6%B4%BE%E9%A9%BB%E5%9Cあなたが見るように、UTF16-BEが最も近いですが、2バイトしかかからず、さらに%uが必要です。予想されるユニコードに示されているように、すべての文字の前に表示されます。

URLEncoderメソッドを使用して、標準のcharsetエンコーディングでエンコードされたテキストを取得しましたが、期待されるユニコードを返さないようです。

コード:

String text = "的事故事务院治党派驻地是不是"; 
URLEncoder.encode(text, "UTF-16BE"); 
+0

[Javaで文字列の文字セットをチェックする方法は?](https://stackoverflow.com/questions/11497902/how-to-check-the-charset-of-string-in-java) – Dziugas

+3

あなたの期待は間違っています。 – Kayaman

+0

@ Kayamanこれは、Chromeのコンソールで投稿リクエストを盗聴している間に取得したユニコードの値です。 – FadhliS

答えて

0

Kayamanはコメントで言ったように:あなたの期待が間違っています。

%uNNNNは、Unicodeテキストの有効なURLエンコードではないためです。 Wikipedia says itとおり%uxxxxxxxxは4桁の16進数として表されるUTF-16コード単位である:

Unicode文字用の非標準エンコーディングが存在します。 この動作はRFCで規定されておらず、W3Cによって拒否されています。

サーバーが非標準入力が予想されない限り、あなたの期待が間違っています。

代わりに、UTF-8を使用してください。 Wikipedia says itとして:

URIの文字データの表現を提供する新しいURIスキームは、実際には、翻訳せずに予約されていないセットから文字を表現しなければならない、とは、他のすべての文字を変換する必要があり、一般的なURI構文の義務UTF-8に準拠したバイト数に変換し、それらの値をパーセントでエンコードします。。この要件は、RFC 3986の公開とともに2005年1月に導入されました。この日付以前に導入されたURIスキームは影響を受けません。

ただし、これはURLにデータを送信するためのものです。GETの一部として

application/x-www-form-urlencodedの一部がHTML5 documentationを参照してください、POSTをエンコードなどのテキストデータを送信する場合:

  • form要素がaccept-charset属性を持っている場合は、選択した文字エンコーディングは、エンコーディングを選ぶの結果としますフォームのために。

  • form要素にはaccept-charset属性がなく、ドキュメントの文字エンコーディングがASCII互換の文字エンコーディングである場合、その文字エンコーディングが選択されます。

  • そうでない場合は、選択した文字エンコーディングがUTF-8とします。ほとんどのWebページ( "ドキュメント")はUTF-8、これらの日に提示されているので

、それはおそらくUTF-8を意味します。

+0

ありがとう、ありがとう。だから私はポストリクエストのためにform-urlencodedにリクエストプロパティを設定する必要があります。この場合、UTF-8を受け入れるように文字セットを設定すると、UTF-8データを送信できます。これはあなたが意味することですか? – FadhliS

0

あなたはあまりにも遠すぎると思っています。テキストのエンコーディングは、このテキストのUnicodeコードポイントの文字列に「似ている」必要はありません。これらは2つの異なるものです。

POSTリクエストで文字列的事故事务院治党派驻地是不是を送信するには、POSTリクエスト全体を書き込み、UTF-8でエンコードします。結果のバイトはPOST要求の本体としてサーバーに送信されます。

@Andreasで指摘されているように、UTF-8はHTML5のデフォルトのエンコーディングであるため、サーバーは自動的にUTF-8を使用してリクエストの本文をデコードしますので、accept-charset属性を設定する必要はありません。 accept-charsetが設定されていません。

関連する問題