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

Incorrect encoding from uploaded text file

我正在开发一个 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 class 和定界符来分割数据,但如果有其他方法,我不会以任何方式受其约束。 .

感谢指点

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

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

将字符集 ISO-8859-1 (Latin-1) 替换为 Windows-1252 (Windows Latin-1),因为所有浏览器都将 ISO-8859-1 解释为 Windows-1252.

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

如果文件内容符合多字节UTF-8格式,则取之。 UTF-8 验证。

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

对于字符集检测,将文件作为二进制数据、字节读取,无需 InputStreamReader。