上传文本文件的编码不正确

时间:2017-11-01 21:54:24

标签: java java-ee encoding multipart

我正在开发一个JavaEE应用程序,用于将文本文件上传到服务器,以处理其内容。 用户的文本来源可能差异很大,尤其是编码。

我想将所有内容转换为UTF-8(持久性即将到来)但首先,我需要正确阅读。

我正在使用InputStreamReader的getEncoding()方法:

public void doThings(HttpServletRequest request) {
    Part file = request.getPart("formfile");
    InputStreamReader isr = new InputStreamReader(file.getInputStream());

    // BUT THIS ALWAYS prints "UTF8" whatever the text file's encoding is :
    System.out.println( isr.getEncoding() );
}

我实际上使用的是InputStream,因为该应用程序稍后使用Scanner类和分隔符来切断数据,但如果还有其他方法可行,我不会以任何方式约束它......

感谢您的任何指示

1 个答案:

答案 0 :(得分:2)

您需要执行new InputStreamReader(file.getInputStream(), charsetOfFile);,否则默认为应用程序的平台,显然是UTF-8。

没有可靠的方法来提取编码/字符集。标题不是决定性的,part.getContentType()也是更多的猜测类型。也许如果出现的字符集可能是第一个指标。

用Windows-1252(Windows Latin-1)替换charset ISO-8859-1(Latin-1),因为所有浏览器都将ISO-8859-1解释为Windows-1252。

Windows-1252也是一个很好的默认设置(因为ISO-8859-1也是HTTP默认设置)。

如果文件内容符合多字节UTF-8格式,请执行此操作。 UTF-8验证。

Charset detection由一些库实现。 我使用语言检测(按频率列表)进行了自己的检测,不完整。

对于字符集检测,将文件读取为二进制数据,字节,不带InputStreamReader。