表单发布为多部分/表单数据时,UTF-8文本出现乱码

我正在上传文件到服务器。 file uploadHTML表单有两个字段:

  1. 文件名 – 用户可以用任何语言给出名称的HTML文本框。
  2. file upload – 一个HTMl'文件',用户可以在其中指定一个文件从磁盘上传。

表格提交时,文件内容被正确接收。 但是,当读取文件名(上面的第1点)时,它是乱码。 ASCII字符显示正确。 当用其他语言(德语,法语等)给出这个名字时,就会出现问题。

在servlet方法中,请求的字符编码设置为UTF-8。 我什至试图做一个filter如上所述 – 我如何使这个代码提交一个UTF-8格式的textarea与jQuery / Ajax的工作? – 但它似乎没有工作。 只有文件名似乎是乱码。

文件名所在的MySQL表支持UTF-8。 我给了随机的非英文字符,他们正确地存储/显示。

使用Fiddler,我监视了请求&所有POST数据传递正确。 我试图确定数据如何/在哪里可能会出现乱码。 任何帮助将不胜感激。

我使用Apache commons-fileupload时遇到同样的问题。 我没有find是什么原因造成的问题,特别是因为我在以下地方使用了UTF-8编码:1. HTML元标记2.表单accept-charset属性3. Tomcat过滤每个设置“UTF-8”编码

– >我的解决scheme是特别将string从ISO-8859-1(或任何平台的默认编码)转换为UTF-8:

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

希望有所帮助

只需使用Apache commons上传库即可。 将URIEncoding="UTF-8"添加到Tomcat的连接器,并使用FileItem.getString(“UTF-8”)而不是FileItem.getString()而不指定字符集。

希望这个帮助。

我陷入了这个问题,发现这是调用的顺序

 request.setCharacterEncoding("UTF-8"); 

这是造成这个问题。 必须在调用request.getParameter()之前调用它,所以我在filter链的顶部使用了一个特殊的filter。

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

我有同样的问题,事实certificate,除了在filter中指定的编码

 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元标记,则不需要HTML元标记。

如果有人在使用Grails(或纯Spring)Web应用程序时偶然发现了这个问题,那么这篇文章对我有帮助:

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

要为多部分请求设置默认编码为UTF-8(而不是ISO-8859-1),我在resources.groovy(Spring DSL)中添加了以下代码:

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

filter是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连接string是否指定UTF-8? 例如

 jdbc:mysql://127.0.0.1/dbname?requireSSL=false&useUnicode=true&characterEncoding=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 

filter和设置Tomcat以支持UTF-8 URI只有在您通过URL的查询string传递时才如此,就像使用HTTP GET一样。 如果你正在使用一个POST,在HTTP消息正文中有一个查询string,什么是重要的是要求的内容types,这将由浏览器设置内容types为UTF-8和用该编码发送内容。

真正做到这一点的唯一方法是告诉浏览器你只能通过在每个响应“UTF-8; q = 1,ISO-8859-1; q = 0.6”上设置Accept-Charset头来接受UTF- 。 这将把UTF-8作为最好的质量和默认的字符集ISO-8859-1作为可接受的,但质量较低。

当你说文件名是乱码的时候,是否在HttpServletRequest.getParameter的返回值中出现乱码?

我正在使用glassfish和SQL Server的Primefaces。

在我的情况下,我创build了Webfilter,在后端,获取每个请求,并转换为UTF-8,如下所示:

 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 paremeter的forms为UTF-8像@凯文拉赫:

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

您不使用UTF-8编码HTML表单的文本数据。 html标准定义了两个编码, 这个标准的相关部分在这里 。 比处理ascii的“旧”编码是application / x-www-form-urlencoded。 新的,正常工作,是多部分/forms的数据。

具体来说,表单声明如下所示:

  <FORM action="http://server.com/cgi/handle" enctype="multipart/form-data" method="post"> <P> What is your name? <INPUT type="text" name="submit-name"><BR> What files are you sending? <INPUT type="file" name="files"><BR> <INPUT type="submit" value="Send"> <INPUT type="reset"> </FORM> 

而我认为这就是所有你必须担心的 – networking服务器应该处理它。 如果您正在编写的东西直接从Web客户端读取InputStream,则需要阅读RFC 2045和RFC 2046 。