从 UTF-16LE 编码文件中删除非法 xml 个字符

Remove illegal xml characters from UTF-16LE encoded file

我有一个 java 应用程序,它解析以 utf-16le 编码的 xml 文件。由于非法 xml 字符,xml 在解析时出错。我的解决办法是把这个文件读入一个java字符串,然后去掉xml字符,这样就可以成功解析了。它工作 99%,但此过程的输入输出存在一些细微差异,不是由删除非法字符引起的,而是从 utf-16le 编码到 java 字符串 utf-16.. 我认为

BufferedReader reader = null;
    String fileText = ""; //stored as UTF-16
    try {
        reader = new BufferedReader(new InputStreamReader(in, "UTF-16LE"));
        for (String line; (line = reader.readLine()) != null; ) {
            fileText += line;
        }
    } catch (Exception ex) {
        logger.log(Level.WARNING, "Error removing illegal xml characters", ex);
    } finally {
        if (reader != null) {
            reader.close();
        }
    }

//code to remove illegal chars from string here, irrelevant to problem 

        ByteArrayInputStream inStream = new ByteArrayInputStream(fileText.getBytes("UTF-16LE"));
    Document doc = XmlUtil.openDocument(inStream, XML_ROOT_NODE_ELEM);

从 UTF-16LE 到 UTF-16 时,字符会得到 changed/lost 吗?在 java 中有没有办法做到这一点并确保输入与输出完全相同?

当然有一个问题是 readLine 丢弃了行尾。

您需要执行以下操作:

       fileText += line + "\r\n";

否则 XML 属性、DTD 实体或其他东西可能会粘在一起,至少需要 space。此外,您不希望文本内容在包含换行符时被更改。

可以使用

提高性能(速度和内存)
StringBuilder fileText = new StringBuilder();
... fileText.append(line).append("\n");
... fileText.toString();

那么文件的第一个字符可能有问题, 有时会多余地添加:一个 BOM 字符。

line = line.replace("\uFEFF", "");