Java:如何从inputStream获取编码?

标签 java encoding io

我想从流中获取编码。

第一种方法 - 使用 InputStreamReader。

但它总是返回操作系统编码。

InputStreamReader reader = new InputStreamReader(new FileInputStream("aa.rar"));
System.out.println(reader.getEncoding());

output:GBK

第二种方法 - 使用 UniversalDetector。

但它总是返回 null。

    FileInputStream input = new FileInputStream("aa.rar");

    UniversalDetector detector = new UniversalDetector(null);
    byte[] buf = new byte[4096];

    int nread;
    while ((nread = input.read(buf)) > 0 && !detector.isDone()) {
        detector.handleData(buf, 0, nread);
    }

    // (3)
    detector.dataEnd();

    // (4)
    String encoding = detector.getDetectedCharset();

    if (encoding != null) {
        System.out.println("Detected encoding = " + encoding);
    } else {
        System.out.println("No encoding detected.");
    }

    // (5)
    detector.reset();

output:null

我怎样才能得到正确的答案? :(

最佳答案

让我们恢复一下情况:

  • InputStream 传递字节
  • *阅读器以某种编码传递字符
  • new InputStreamReader(inputStream) 使用操作系统编码
  • new InputStreamReader(inputStream, "UTF-8") 使用给定的编码(此处为 UTF-8)

所以在阅读之前需要知道编码。您首先使用字符集检测类做了所有正确的事情。

阅读http://code.google.com/p/juniversalchardet/它应该处理 UTF-8 和 UTF-16。 您可以使用编辑器JEdit来验证一下编码,看看是否有问题。

关于Java:如何从inputStream获取编码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57708510/

相关文章:

encoding - Android Studio 将 BOM 写入 UTF-8 文件

c# - 如何在 C# 中强制解锁文件?

c - 在一个只读 fd 上进行 IO 多路复用是否比简单地阻塞读取有助于获得更好的性能?

java - JPA namedQuery 中的 COALESCE

java - Jython 中的 Python 解释器

python - 将 python 输出重定向到文件会导致 Windows 上的 UnicodeEncodeError

Java 6 上的 java.nio.Files、java.nio.Paths

java - 将 String 转换为任何所需类的通用代码

用于 RangeSlider 的 JavaFX ControlsFX CSS

xml - 提取响应的编码转换