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

时间:2017-11-16 14:31:17

标签: java xml utf-16 utf-16le

我有一个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时,字符是否会发生变化?有没有办法在java中执行此操作并确保输入与输出完全相同?

1 个答案:

答案 0 :(得分:1)

当然有一个问题是readLine会抛弃结束的行。

您需要执行以下操作:

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

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

使用

可以改善性能(速度和内存)
StringBuilder fileText = new StringBuilder();
... fileText.append(line).append("\n");
... fileText.toString();

然后文件的第一个字符可能存在问题,即 有时会添加冗余:BOM char。

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