【发布时间】:2021-05-07 19:33:20
【问题描述】:
所以我的数据库中有一个值,其中包含  形式的不间断空格。我有一个遗留服务,它从数据库中读取这个字符串并使用这个字符串创建一个 XML。我面临的问题是为此消息返回的 XML 是不可解析的。当我在记事本 ++ 中打开它时,我看到字符 xA0 代替了不间断空格,并且在删除此字符后,XML 变得可解析。此外,我有来自同一服务的此 XML 文件的旧版本,其中字符 "Â " 代替了非中断空间。我最近更改了运行该服务的tomcat服务器,因此出现了问题。我发现了这个post,据此我的XML 被编码为ISO-8859-1;,但我用来将XML 转换为字符串的代码不使用ISO-8859-1;。下面是我的代码
private String nodeToString(Node node) {
StringWriter sw = new StringWriter();
try {
Transformer t = TransformerFactory.newInstance().newTransformer();
t.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no");
t.transform(new DOMSource(node), new StreamResult(sw));
} catch (TransformerException te) {
LOG.error("Exception during String to XML transformation ", te);
}
return sw.toString();
}
我想知道为什么我的 XML 无法解析以及为什么在 XML 文件的旧版本中存在 "Â "。
这是记事本++中问题字符的图像 image in notepad++
另外,当我在记事本中打开我的 XML 并尝试保存它时,我看到编码类型是 ANSI,当我将它更改为 UTF-8 然后保存它时,XML 变得可解析。
新信息 - 使用 transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); 强制执行 UTF-8 不起作用我仍然在我的 XML 中获得 xA0。
【问题讨论】:
-
其他字符编码是否正确,或者这是一个更普遍的编码问题? (我怀疑是后者)
-
其他字符好像没问题,只是非换行空格字符有问题。
-
所以像变音符号
ÄÖÜäöü这样的字符可以正常工作吗? (只是选择它们,因为我已经在我的键盘上准备好了它们 ;-) 根据您的环境,其他测试字符串可能更容易创建)。 -
我想知道强制编码是否有帮助? transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
-
我目前无法访问数据库,因此我无法检查这些测试字符串。但是我想再次强调的问题是,为什么 xa0 会使 XML 不可解析? xa0 是 UTF-8 中 nbsp 的正确字符吗?在旧版本中使 nbsp "Â " 的编码是什么?
标签: java xml encoding utf-8 iso-8859-1