web-dev-qa-db-ja.com

HttpServletRequest-setCharacterEncodingは何もしないようです

リクエストからUTF-8情報を読み取ろうとしています。 「request.setCharacterEncoding( "UTF-8");」を使用しましたが、何も実行されないようです-読み取られた情報はUTF-8以外です。

何が悪いのですか?

25
Erik Sapir

Tomcatを使用している場合は、コネクタでURIEncodingもUTF-8に設定する必要があります。

<Server port="8105" shutdown="SHUTDOWN">
...
    <Service name="Catalina">
        <Connector port="8180" URIEncoding="UTF-8" />
        <Engine name="Catalina" defaultHost="localhost">
            <Host name="localhost" appBase="webapps" />
        </Engine>
    </Service>
</Server>
24
Maurice Perry

HttpServletRequest#setCharacterEncoding() は、リクエストがPOSTリクエストでありリクエスト本文が未処理はまだ処理されていません。

したがって、それがあなたのケースで機能しない場合、2つの原因が考えられます:

  1. 実際にGETリクエストを発行しています。つまり要求パラメーターは、要求本文ではなく要求URLでクライアントからサーバーに送信されます。リクエストURLは、サーブレットAPIではなくWebサーバーによって処理されます。したがって、これを修正するには、指定された文字エンコーディングを使用してリクエストURL(URI)をデコードするように問題のウェブサーバーを構成する必要があります。たとえばApache Tomcatの場合、_<Connector>_の _server.xml_ 要素のURIEncoding属性を_UTF-8_に設定する必要があります。

  2. POSTを正しく使用していますが、リクエストボディをすでに(間接的に)処理しているため、文字エンコーディングを変更するには遅すぎます。 getParameterXXX()メソッドの最初の呼び出しが行われたときにのみ、リクエストの本文が完全に処理されます。 数個 があります。以降の呼び出しでは再処理されません。このメソッドを呼び出しているユーザーを特定するときは、_web.xml_で宣言されているすべてのFilterインスタンスを考慮することを忘れないでください。それらの一部は、パラメーターを取得してスキャンする場合があります。

それでも何も解決しない場合は、表示コンソールまたはロガー、または取得した要求パラメーターの印刷/決定/デバッグに使用しているものがUTF-8をサポートしていないことが唯一の原因です。文字を表示する代わりにUTF-8を使用するようにコンソール/ロガーなどを再構成したいとします。たとえばEclipseコンソールの場合は、Window> Preferences> General> Workspace> Text File Encodingで設定できます。

以下も参照してください。

19
BalusC

この方法は本当に愚かです。そこにあるべきではありませんし、それを使うべきではありません。

POSTリクエストの本文の場合、エンコードはクライアントによってContent-Typeヘッダーで明示的に定義されている必要があります。そうでない場合、それは悪いリクエストです。[1]

gETリクエストURIの場合、クライアントはエンコーディングを指定できず、サーバーは暗黙的なエンコーディングを持っている必要があり、プログラマはエンコーディングを設定する必要がありますが、そのメソッドはサーブレットAPIに存在しません!

ただし、サーブレットコンテナには独自の方法でそれを行うことができます。

最善の方法は、JVMのデフォルトのエンコーディングをUTF-8に設定することです。

1: http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.7.1

「charset」パラメータは、データの文字セット(セクション3.4)を定義するために一部のメディアタイプで使用されます。送信者によって明示的な文字セットパラメータが提供されない場合、「テキスト」タイプのメディアサブタイプはデフォルト文字セット値「ISO-8859」を持つように定義されます。 HTTP経由で受信した場合は-1。 「ISO-8859-1」またはそのサブセット以外の文字セットのデータ[〜#〜] [〜#〜]には適切なラベルを付ける必要があります文字セット値。

5
irreputable

問題は、どのアプリケーションサーバーが使用されているかによって異なります。この link で見つけた最高の説明。

一部のアプリケーションサーバーでは、記述子を使用してアプリケーションのエンコーディングを設定するまで、request.setCharacterEncoding(...)は効果がありません。最も複雑なのは、JBoss、Apache Tomcat、Glassfishです。 WebLogicが最適で、Jettyが最適です(UTF-8がデフォルト設定です)。

私の場合、glassfish-web.xml記述子とそこにparameter-encoding 鬼ごっこ。私の場合、GlassFishの場合:

<glassfish-web-app error-url="">
    <!-- request.setCharacterEncoding("UTF-8") not functioning without this setting-->
    <parameter-encoding default-charset="UTF-8" />
</glassfish-web-app>
2
hariprasad

POSTパラメータの場合、パラメータを取得する前にrequest.setCharacterEncoding(...)を呼び出す必要があることを確認します。GETパラメータの場合は、使用しているWebコンテナに依存します(Maurice PerryのTomcatの回答)。

詳細については、このリンクを確認してください。 「ブラウザからデータベースへの文字変換」 http://Java.Sun.com/developer/technicalArticles/Intl/HTTPCharset/

1
Virasak

request.getParameter呼び出しの後にそれを行っていますか?.

request.setCharacterEncoding("UTF-8")は、request.getParameter()を呼び出す前に呼び出す必要があります。

1
sushil bharwani

(最初の質問については..)
本文からパラメーターを読み取る場合、独自のエンコーディングで各項目を読み取ることもできます(最後の行を見てください)。

ServletFileUpload upload = new ServletFileUpload(new DiskFileItemFactory());
List items = null;
try {
    items = upload.parseRequest(request);
} catch (FileUploadException ex) {
    logger.warn("Fail during file upload");
    return uploads;
}

Iterator itr = items.iterator();
while (itr.hasNext()) {
    FileItem item = (FileItem) itr.next();
    if (item.isFormField()) {
        String name = item.getFieldName();
        System.out.println("name: " + name);
        String value = item.getString();
        System.out.println("get as utf8 - "+item.getString("UTF-8"));
0
ozma

jboss/wildflyには機能リクエストがあります https://issues.jboss.org/browse/WFLY-25

これをWEB-INF/jboss-web.xmlにドロップします。

<?xml version="1.0" encoding="UTF-8"?>
<jboss-web version="8.0" xmlns="http://www.jboss.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.jboss.org/j2ee/schema/jboss-web_8_0.xsd">
    <!-- browser tend to not send encoding information, so we have to match the servlet container's
    default encoding with our requested form data encoding: -->
    <default-encoding>UTF-8</default-encoding>
</jboss-web>
0
user1050755