web-dev-qa-db-ja.com

フォームがmultipart / form-dataとして投稿されるとUTF-8テキストが文字化けする

サーバーにファイルをアップロードしています。ファイルアップロードHTMLフォームには2つのフィールドがあります。

  1. ファイル名-ユーザーが任意の言語で名前を付けることができるHTMLテキストボックス。
  2. ファイルのアップロード-ユーザーがディスクからアップロードするファイルを指定できるHTMl「ファイル」。

フォームが送信されると、ファイルの内容が適切に受信されます。ただし、ファイル名(上記のポイント1)が読み取られると、文字化けします。 ASCII文字は適切に表示されます。名前が他の言語(ドイツ語、フランス語など)で指定されている場合、問題があります。

サーブレットメソッドでは、リクエストの文字エンコーディングはUTF-8に設定されます。前述のようにフィルターを試してみました- jQuery/AjaxでUTF-8フォームのテキストエリアを送信するためにこのコードを作成するにはどうすればよいですか? -見えない動作するように。ファイル名のみが文字化けしているようです。

ファイル名のあるMySQLテーブルはUTF-8をサポートします。英語以外の文字をランダムに指定しましたが、それらは適切に保存/表示されます。

Fiddlerを使用して、リクエストを監視し、すべてのPOSTデータが正しく渡されました。データが文字化けする可能性のある場所/場所を特定しようとしています。どんな助けも大歓迎です。

50
Aswin Anand

Apache commons-fileuploadを使用しても同じ問題が発生しました。特に次の場所にUTF-8エンコーディングがあるため、問題の原因を見つけられませんでした。1. HTMLメタタグ2.フォームaccept-charset属性エンコーディング

->私の解決策は、特に文字列をISO-8859-1(またはプラットフォームのデフォルトエンコーディング)からUTF-8に変換することでした。

new String (s.getBytes ("iso-8859-1"), "UTF-8");

それが役立つことを願って

編集:Java 8で始まる、次も使用できます。

new String (s.getBytes (StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
55
Philip Helger

Apache commons upload libraryを使用するだけです。 URIEncoding="UTF-8"をTomcatのコネクタに追加し、文字セットを指定せずにFileItem.getString()の代わりにFileItem.getString( "UTF-8")を使用します。

この助けを願っています。

26
nautilusvn

私はこの問題で立ち往生し、それがへの呼び出しの順序であることがわかりました

request.setCharacterEncoding("UTF-8");

それが問題を引き起こしていました。 request.getParameter()へのすべての呼び出しの前に呼び出す必要があるため、フィルターチェーンの最上部で使用する特別なフィルターを作成しました。

http://www.ninthavenue.com.au/servletrequest-setcharactercoding-ignored

18
Roger Keays

私は同じ問題を抱えていたので、フィルターでエンコードを指定することに加えて、

request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");

フォームに「acceptcharset」を追加する必要があります

<form method="post" enctype="multipart/form-data" acceptcharset="UTF-8" > 

およびJVMを実行

-Dfile.encoding=UTF-8

Response.setCharacterEncoding()を使用してHTTPヘッダーで送信する場合、HTMLメタタグは不要です。

11
Dan

Grails(または純粋なSpring)Webアプリケーションで作業しているときに誰かがこの問題に出くわした場合は、次の投稿を参考にしてください。

http://forum.spring.io/forum/spring-projects/web/2491-solved-character-encoding-and-multipart-forms

マルチパートリクエストのデフォルトのエンコードを(ISO-8859-1ではなく)UTF-8に設定するために、resources.groovy(Spring DSL)に次のコードを追加しました。

multipartResolver(ContentLengthAwareCommonsMultipartResolver) {
    defaultEncoding = 'UTF-8'
}
7

私はorg.Apache.commons.fileupload.servlet.ServletFileUpload.ServletFileUpload(FileItemFactory)を使用し、パラメーター値を読み取るときにエンコードを定義しています:

List<FileItem> items = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);

for (FileItem item : items) {
    String fieldName = item.getFieldName();

    if (item.isFormField()) {
        String fieldValue = item.getString("UTF-8"); // <-- HERE
3
György Novák

フィルターはIEの鍵です。確認すべき他のいくつかのこと。

ページエンコーディングと文字セットとは何ですか?両方ともUTF-8でなければなりません

<%@ page language="Java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

メタタグの文字セットは何ですか?

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

MySQL接続文字列はUTF-8を指定していますか?例えば.

jdbc:mysql://127.0.0.1/dbname?requireSSL=false&useUnicode=true&characterEncoding=UTF-8
2
Michael Glenn

GlassfaceとSQL ServerでPrimefacesを使用しています。

私の場合、すべてのリクエストを取得してUTF-8に変換するために、次のようにバックエンドでWebfilterを作成しました。

package br.com.teste.filter;

import Java.io.IOException;

import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;

@WebFilter(servletNames={"Faces Servlet"})
public class Filter implements javax.servlet.Filter {

    @Override
    public void destroy() {
        // TODO Auto-generated method stub

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        request.setCharacterEncoding("UTF-8");
        chain.doFilter(request, response);      
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // TODO Auto-generated method stub      
    }

}

ビュー(.xhtml)で、enctypeパラメーターの形式を@Kevin RaheのようなUTF-8に設定する必要があります。

    <h:form id="frmt" enctype="multipart/form-data;charset=UTF-8" >
         <!-- your code here -->
    </h:form>  
1
Weles

すべてのリクエストパラメータを手動でUTF-8に変換しないようにするには、コントローラーで@InitBinderアノテーションが付けられたメソッドを定義できます。

@InitBinder
protected void initBinder(WebDataBinder binder) {
    binder.registerCustomEditor(String.class, new CharacterEditor(true) {
        @Override
        public void setAsText(String text) throws IllegalArgumentException {
            String properText = new String(text.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
            setValue(properText);
        }
    });
}

上記は、定義されているコントローラーですべての要求パラメーターをUTF-8に自動的に変換します。

0
Vlad

また、web.xmlのエンコーディングフィルター(org.springframework.web.filter.CharacterEncodingFilter)がマルチパートフィルター(org.springframework.web.multipart.support.MultipartFilter)の前にマッピングされていることを確認する必要があります。

0
Romain VDK

HTTP GETの場合のように、URLのクエリ文字列を介して渡す場合のみ、フィルター処理とUTF-8 URIをサポートするためのTomcatのセットアップが重要です。 HTTPメッセージの本文にクエリ文字列を使用してPOSTを使用している場合、重要なのはリクエストのコンテンツタイプです。これは、コンテンツタイプをUTF-8に設定するためのブラウザ次第です。そのエンコーディングでコンテンツを送信します。

これを実際に行う唯一の方法は、すべての応答でAccept-Charsetヘッダーを「UTF-8; q = 1、ISO-8859-1; q = 0.6」に設定することでUTF-8のみを受け入れることができることをブラウザに伝えることです。 。これにより、UTF-8が最高品質になり、デフォルトの文字セットISO-8859-1が受け入れ可能になりますが、品質は低下します。

ファイル名が文字化けしていると言うとき、HttpServletRequest.getParameterの戻り値で文字化けしていますか?

0
nbeyer

私はパーティーに遅れていると思いますが、ワイルドフライを使用すると、standalone.xmlにdefault-encodingを追加できます。 standalone.xmlで検索するだけです

<servlet-container name="default"> 

次のようなエンコーディングを追加します。

<servlet-container name="default" default-encoding="UTF-8">
0
Patrick P

同じ問題がありました。私のために働いた唯一のソリューションは、<property = "defaultEncoding" value = "UTF-8">をspring構成ファイルのmultipartResolerに追加することでした。

0
aManjate