Servlet不会将上传的文件解析为UTF-8

时间:2013-12-23 20:22:42

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

我在将文件上传和解析为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>

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

2 个答案:

答案 0 :(得分:2)

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

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

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

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

就是这样。

答案 1 :(得分:0)

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

相关问题