Java:InputStreamReader字符编码需要运行两次

omqzjyyz  于 2023-03-28  发布在  Java
关注(0)|答案(1)|浏览(164)

我的公司与世界各地的客户进行了大量的XML转换工作。因此,我们有时会遇到字符编码问题。我们的应用程序中有一个组件,旨在将InputStream规范化为特定的字符编码。它工作得很好......但有一个问题。
在某些情况下,我们需要运行它两次。对于我的生活,我不能告诉你为什么,我一直在努力找出是什么导致它,我什么也没想到。它只是似乎有一些文件,当它第一次运行时,它并没有使它正确,但当它第二次运行时,一切终于好了。
下面是进行编码的代码(假设“encoding”变量是“UTF-8”,它通常是):

char[] buffer = new char[getBufferSize()];
String encoding = getEncoding();

Cache fileCache = getFileCache();

try (InputStreamReader reader = new InputStreamReader(data.getDataStream(), encoding); Writer writer = fileCache.getWriter(encoding)) {
    int charsRead;
    while ((charsRead = reader.read(buffer)) != -1) {
        writer.write(buffer, 0, charsRead);
    }
    data.setDataStream(fileCache.getInputStream());
} catch(IOException ex) {
    throw new Exception(String.format("Unable to normalize stream for %s encoding", encoding), ex);
}

因此,有时需要运行此代码两次,以使流正确地使用指定的编码。
我想让它在第一次尝试时运行得更好。
1.此问题可能有哪些原因?
1.有什么方法可以改进这段代码,使“流规范化”(我们称之为)更有效吗?
1.除了使用InputStreamReader之外,还有哪些修复流编码的替代方法可能更好?

jogvjijk

jogvjijk1#

使用XML有一些小问题:在第一行中,<?xml ... ?>指定了一个编码或默认为UTF-8。因此,XML通常被读取为InputStream(二进制),并留给XML解析器来查找编码。
在编写XML时,可以假设它在String中表示。在编写<?xml ... ?>的编码时,应该在new OutputStreamWriter(ouputStream, encoding)中使用。
必须在处理编码的程序员编辑器(如JEdit或Notepad++)中测试二进制输入和输出XML的编码。
如果您想立即阅读正确编码的文本:我搜索了XMLInputStreamReader并找到了一些。但是你的Reader类需要做的就是:缓冲ByteArrayOutputStream中的第一个字节,直到处理完<?xml encoding=...?>,然后执行InputStreamReader。

相关问题