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

2022-08-31 16:49:39

我正在将文件上传到服务器。文件上传 HTML 表单包含 2 个字段:

  1. 文件名 - 一个 HTML 文本框,用户可以在其中以任何语言命名。
  2. 文件上传 - 一个HTMl“文件”,用户可以在其中指定要从磁盘上传的文件。

提交表单后,将正确接收文件内容。但是,当读取文件名(上面的第 1 点)时,它会出现乱码。ASCII 字符正确显示。当名称以其他语言(德语,法语等)给出时,存在问题。

在 servlet 方法中,请求的字符编码设置为 UTF-8。我甚至尝试做一个过滤器,如上所述 - 我如何使这个代码提交一个带有jQuery / Ajax工作的UTF-8表单文本区域? - 但它似乎不起作用。只有文件名似乎是乱码。

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

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


答案 1

我在使用Apache commons-fileupload时遇到了同样的问题。我没有找出导致问题的原因,特别是因为我在以下位置有UTF-8编码:1.HTML元标记2。表单接受字符集属性 3。Tomcat 对每个设置“UTF-8”编码的请求进行筛选

->我的解决方案是特别将字符串从ISO-8859-1(或任何平台的默认编码)转换为UTF-8:

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

希望有所帮助

编辑:从Java 7开始,您还可以使用以下方法:

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

答案 2

只需使用Apache共享资源上传库。添加到 Tomcat 的连接器,并在未指定字符集的情况下使用 FileItem.getString(“UTF-8”) 而不是 FileItem.getString()。URIEncoding="UTF-8"

希望这有帮助。


推荐