我有一个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中执行此操作并确保输入与输出完全相同?
答案 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", "");