【问题标题】:Servlet doesn't parse uploaded file as UTF-8Servlet 不会将上传的文件解析为 UTF-8
【发布时间】:2013-12-23 20:22:41
【问题描述】:

我在将文件上传和解析为 UTF-8 字符串时遇到问题。我使用以下代码:

protected void doPost(HttpServletRequest request, HttpServletResponse response) 
        throws ServletException, IOException {
    Part filePart = request.getPart("file");
    InputStream filecontent = filePart.getInputStream();
    // ...
}

我的网页是这样的:

<%@ page language="java" contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8"%>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  </head>
  <body>
    <form action="UploadServlet" method="post" enctype="multipart/form-data">
      <input type="file" name="file" />
      <input type="submit" />
    </form>
  </body>
</html>

我发现了一个很棒的post 关于 java webapps 中的 UTF-8 编码,但不幸的是它对我不起作用。我在 NetBeans 调试器中的字符串中仍然有随机符号,当我在网页上显示它们时,尽管它们中的大多数都能正确显示,但一些西里尔字母(я、с、Н、А)被替换为“�?”

【问题讨论】:

  • 问题出在使用该文件内容流的代码中,您没有向我们展示。
  • @bmargulies 我没有故意展示它,因为我是从桌面应用程序移植它的,它在那里完美运行。
  • 您可能有不同的默认编码。

标签: java jakarta-ee servlets encoding utf-8


【解决方案1】:

使用 HTML 表单上传文件不使用任何字符编码。文件按原样逐字节传输。请参阅“multipart/form-data”下的here

所以如果客户端的原始文件是UTF-8字符编码的文本文件,那么在服务器端也是UTF-8。

然后您可以使用 InputStreamReader 将字节解码为 UTF-8 文本:

InputStreamReader reader = new InputStreamReader(filecontent, "UTF-8");

就是这样。

【讨论】:

    【解决方案2】:

    javax.servlet.http.Part,你在代码的第一行使用的,上面有一个方法getContentType(),它会告诉你上传的表单数据的内容类型是什么。您迄今为止所写的任何内容都不会将上传的表单数据限制为任何特定的字符集;因此,您需要确定字符集并相应地处理它。

    【讨论】:

      猜你喜欢
      • 2016-05-11
      • 2013-07-14
      • 1970-01-01
      • 1970-01-01
      • 2018-11-17
      • 1970-01-01
      • 1970-01-01
      • 2013-08-04
      • 1970-01-01
      相关资源
      最近更新 更多