【问题标题】:opposite world "XML Parsing Error: not well-formed" error对面世界“XML Parsing Error: not well-formed”错误
【发布时间】:2014-08-01 19:15:33
【问题描述】:

我知道“XML 解析错误:格式不正确”的广义含义。不知何故,文本不符合 xml 规范。这通常意味着存在不匹配的标签或者可能是错误的标题。

但是,也有格式不正确的文档的字符编码类型。我得到的结果似乎与我的预期相反。

当我从 windows 7 机器上的浏览器对 java rest 服务进行休息调用时,我会返回一个 xml 文档,其中包含以下文字,如下所示:

<foo>RÜCK</foo>

我知道这就是我得到的,因为我使用 curl 来保存结果,而这正是文档中的内容。但是,当在 firefox、ie8 或 chrome 中查看时,文本的“Ü”部分实际上显示为一个 U,其上方有 2 个点。而且,没有一个浏览器会抱怨文档格式不正确。

然后我调用相同的 rest 服务,除了我从我的 windows 7 机器到运行 tomcat 的 linux 机器。我得到的是:

<foo>RÜCK</foo>

这就是我在使用 curl 下载结果时看到的。但是firefox和ie都抱怨xml文档格式不正确!

我知道,当我复制粘贴“Ü”时,由于文档编码或其他原因,它以某种方式从单个字符变为两个字符。但是,这是下一个令人困惑的事情。

当我更新数据库中的内容以将“RÜCK”存储为复制粘贴值时,当从 Windows 上的 tomcat 发送时它显示为“RÜCK”,但是当从 linux 上的 tomcat 发送时,它给出了一个格式不正确的错误!为什么?

谁能解释究竟是什么导致 windows 和 linux 系统以不同的方式显示相同的数据,以及为什么它不是从 linux tomcat 服务器形成的,但它是从 windows 7 tomcat 服务器形成的?

【问题讨论】:

    标签: java xml tomcat character-encoding


    【解决方案1】:

    XML 1.0 规范在 4.3.3 Character Encoding in Entities 中定义,“如果一个 XML 实体被确定(通过默认、编码声明或更高级别的协议)采用某种编码,则为致命错误但包含在该编码中不合法的字节序列”。它还说,违反格式良好的约束是致命的错误,这显然也意味着在另一个方向上起作用。

    因此,显然您的 XML 文档实际上是 UTF-8 编码的,但声明(或暗示)为 ISO-8859-1(或者可能是 windows-1252),反之亦然。无论哪种方式,都会有必须被识别为非法的字节或字节组合。

    【讨论】:

    • 根据 curl 的说法,两个服务器的内容类型都是“Content-Type: text/xml;charset=UTF-8”。此外,在这两种情况下,xml 文档的标题都是“”。
    • XML 规范还说解析器可以使用“外部信息”(通常是 HTTP 标头中的信息)来推断文件的编码,并优先使用 XML 标头中的信息.因此,您的各种环境中的差异可能是各种解析器在未正确声明编码时推断编码的智能程度的问题。
    • @HappyEngineer,当你有一个 UTF-8 编码的“Ü”并且字节被误解为 windows-1252 编码时,你会得到“Ü”。因此,显然编码信息会以某种方式丢失或更改。使用浏览器的开发人员工具检查浏览器获得的 Content-Type 标头。 (这可能与某些其他软件获取的响应标头不同,因为它取决于请求标头。)
    猜你喜欢
    • 2016-03-22
    • 1970-01-01
    • 2018-12-23
    • 2016-08-11
    • 2012-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    相关资源
    最近更新 更多