从 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", "");
我有一个 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", "");