写入 StringBuilder 时某些字符丢失

Some characters get lost while writing to StringBuilder

我正在处理 Java 代码,这里是:

public InputStream unzip(InputStream inputStream) throws IOException {
        ZipInputStream zipIn = new ZipInputStream(inputStream);
        zipIn.getNextEntry();
        Scanner sc = new Scanner(zipIn);
        StringBuilder sb = new StringBuilder();
        while (sc.hasNextLine()) {
            sb.append(sc.nextLine());
            sb.append("\n");
        }
        System.out.println(sb);
        zipIn.close();
        InputStream is = fromStringBuffer(sb);
        return (InputStream)is;
    }

    public static InputStream fromStringBuffer(StringBuilder sb) {
          return new ByteArrayInputStream(sb.toString().getBytes());
        }

当我解压缩文件时,一些土耳其字符的格式很奇怪(比如 Ü 变成了 Ãœ)。

如何才能将它们正确写入 StringBuilder?

流(属于 java.io 类型,与 java.util.stream 相对)用于读取(或写入)字节.

Scanner 处理 个字符 。如果将 InputStream 传递给 Scanner,则需要提供字符集;否则它使用默认字符集。

但是:这假设传递给 Scanner 的字节流实际上确实代表了一个字符流,使用了一些字符集。 ZipInputStream 不一定:它是压缩文件的内容。如果您说缺少字符,我认为您的压缩文件是文本;但是,从读取zip文件的角度来看,它只是一个字节流。

如果您想要 ZipInputStream 中的 InputStream,只需 return ZipInputStream.

如果您想将 returned 流解释为字符,当然您仍然需要知道字符集;但是你不会在这里引入不必要的从字节到字符到字节的往返。

如果您希望在此方法中处理所有字符集编码,return ReaderInputStream 的类似物,表示字符流。

例如,您可以 return 一个 InputStreamReader,例如new InputStreamReader(zipIn, charset)。这并不能免除您了解正确字符集的问题;但它使方法的调用者不必处理它。