サーバーにファイルをアップロードしています。ファイルアップロードHTMLフォームには2つのフィールドがあります。
フォームが送信されると、ファイルの内容が適切に受信されます。ただし、ファイル名(上記のポイント1)が読み取られると、文字化けします。 ASCII文字は適切に表示されます。名前が他の言語(ドイツ語、フランス語など)で指定されている場合、問題があります。
サーブレットメソッドでは、リクエストの文字エンコーディングはUTF-8に設定されます。前述のようにフィルターを試してみました- jQuery/AjaxでUTF-8フォームのテキストエリアを送信するためにこのコードを作成するにはどうすればよいですか? -見えない動作するように。ファイル名のみが文字化けしているようです。
ファイル名のあるMySQLテーブルはUTF-8をサポートします。英語以外の文字をランダムに指定しましたが、それらは適切に保存/表示されます。
Fiddlerを使用して、リクエストを監視し、すべてのPOSTデータが正しく渡されました。データが文字化けする可能性のある場所/場所を特定しようとしています。どんな助けも大歓迎です。
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);
Apache commons upload libraryを使用するだけです。 URIEncoding="UTF-8"
をTomcatのコネクタに追加し、文字セットを指定せずにFileItem.getString()の代わりにFileItem.getString( "UTF-8")を使用します。
この助けを願っています。
私はこの問題で立ち往生し、それがへの呼び出しの順序であることがわかりました
request.setCharacterEncoding("UTF-8");
それが問題を引き起こしていました。 request.getParameter()へのすべての呼び出しの前に呼び出す必要があるため、フィルターチェーンの最上部で使用する特別なフィルターを作成しました。
http://www.ninthavenue.com.au/servletrequest-setcharactercoding-ignored
私は同じ問題を抱えていたので、フィルターでエンコードを指定することに加えて、
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メタタグは不要です。
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'
}
私は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
フィルターは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
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>
すべてのリクエストパラメータを手動で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に自動的に変換します。
また、web.xmlのエンコーディングフィルター(org.springframework.web.filter.CharacterEncodingFilter)がマルチパートフィルター(org.springframework.web.multipart.support.MultipartFilter)の前にマッピングされていることを確認する必要があります。
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の戻り値で文字化けしていますか?
私はパーティーに遅れていると思いますが、ワイルドフライを使用すると、standalone.xmlにdefault-encodingを追加できます。 standalone.xmlで検索するだけです
<servlet-container name="default">
次のようなエンコーディングを追加します。
<servlet-container name="default" default-encoding="UTF-8">
同じ問題がありました。私のために働いた唯一のソリューションは、<property = "defaultEncoding" value = "UTF-8">をspring構成ファイルのmultipartResolerに追加することでした。