1

getメソッドを使用してフォームを送信するときにパラメーターのエンコードの問題に直面しました(postメソッドを使用できません)。私のページはUTF8であったため、一部の強調文字はURLでエスケープされませんでした。Springコントローラーは代わりに不正な文字を取得しました。

フォームに設定することでこの問題を解決しましたが、サーバーとブラウザのすべての組み合わせでどの文字セットが安全accept-charset="ISO-8859-1"か疑問に思っています。フォームと「get」URLに推奨されるものはありますか?

4

3 に答える 3

7

これは、サーブレットでは(穏やかに言えば)イライラします。標準のURLエンコーディングではUTF-8を使用する必要がありますが、サーブレットはデフォルトでISO-8859-1に設定されているだけでなく、コードでこれを変更する方法も提供していません。

確かにreq.setRequestEncoding("UTF-8")、何かを読む前にできますが、なんらかの不敬虔な理由で、これはリクエストの本文にのみ影響し、クエリ文字列パラメータには影響しません。サーブレット要求インターフェースには、クエリ文字列パラメータに使用されるエンコーディングを指定するものはありません。

フォームでの使用ISO-8859-1はハックです。この古いエンコーディングを使用すると、確実に解決するよりも多くの問題が発生します。特にブラウザはISO-8859-1をサポートしておらず、常にWindows-1252として扱います。サーブレットはISO-8859-1をISO-8859-1として扱うのに対し、これを使用すると、信じられないほど失敗します。

たとえば、Tomcatでこれを変更するには、要素のURIEncoding属性を使用できます。<connector>

<connector ... URIEncoding="UTF-8" ... />

これらの設定を持つコンテナを使用しない場合、設定を変更できない場合、またはその他の問題がある場合でも、ISO-8859-1デコードは元のバイナリからの完全な情報を保持するため、コンテナを機能させることができます。

String correct = new String(request.getParameter("test").getBytes("ISO-8859-1"), "UTF-8")

たとえばtest=ä、すべてが正しく設定されている場合、ブラウザはそれをとしてエンコードしtest=%C3%A4ます。サーブレットはそれをISO-8859-1として誤ってデコードし、結果の文字列を提供します"ä"ä修正を適用すると、元に戻すことができます。

System.out.println(new String("ä".getBytes("ISO-8859-1"), "UTF-8").equals("ä"));
//true
于 2013-03-23T13:09:28.937 に答える
2

nickdosは正しいです。これを行う別の方法は、メタデータタグを使用することです。

<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">

また、サーバーで応答を処理するときは、コードで正しい(同じ)エンコーディングを使用する必要があることにも注意してください。

例:

使用するstringParamer.getBytes("utf-8") instead of stringParamer.getBytes()

また、Springを使用する場合は、DispatcherServletの構成ファイル(XYZ_-servlet.xml)でメッセージコンバーターの正しいエンコードが構成されていることを確認してください。例:

<bean id="stringHttpMessageConverter" class="org.springframework.http.converter.StringHttpMessageConverter">
    <property name="supportedMediaTypes" value = "text/plain;charset=UTF-8"/>
</bean>
于 2013-03-22T11:44:33.983 に答える
1

問題は、URLが常に127-ASCIIとしてエンコードされることです。フォームはGETを介して標準ASCIIセット外の追加の文字値を送り返すため、いくつかの問題が発生しています。

  1. URLは2048文字に制限されているため、フォームの値が切り捨てられる可能性があります
  2. ユーザーがForm属性で設定したISOaccept-type以外の文字を入力すると、それらはURLに正しくエンコードされません。これは、最初にページのエンコーディングを使用した後にURLをエンコードするときに、ブラウザがすべてを127-ASCIIに変換するためです。そのISOセットに含まれていない特殊文字は、正しくエンコードされません。
  3. ブラウザは常に、最初にページエンコーディングまたはメタタグを使用してURL内の文字を変換します。ただし、サーバーのHTTPヘッダーがある場合、そのエンコーディングはメタタグのエンコーディングをオーバーライドします。HTML5ページのデフォルトのエンコーディングはUTF-8です。しかし、あなたはそれを上書きするISO規格を使用しています。それでも、ブラウザによって行われるすべてのエンコーディングは、非ASCII文字を「%」に置き換え、その後にページエンコーディングまたはフォームのセットエンコーディングからの16進数を続けます。その後、サーバーに送信されるので、URLを調べて何が送信されたかを確認してください。
  4. URLがサーバーに到達すると、127-ASCIIとして送信されるため、最初に文字列をASCIIとして取得してから、ページエンコーディングにデコードするか、この場合、フォームは真の値を取得するために使用される値を受け入れる必要があります。

フォームエンコーディングを削除し、より広範な文字サポートのためにページUTF-8設定を使用し、以下の2つのメタタグをドロップして、必要なすべての文字を含み、簡単にデコードできるUTF-8エンコードデータを返送することをお勧めします。上記の他のポスターによって上記のようにサーバー上で。

<meta charset="utf-8" />
<meta content="text/html; charset=utf-8" http-equiv="content-type" />
于 2018-08-29T22:08:00.850 に答える