【问题标题】:Effect of transport encoding on XML encoding and character references传输编码对 XML 编码和字符引用的影响
【发布时间】:2016-07-09 21:32:21
【问题描述】:

这个问题涉及XML 1.0HTTP 1.1 建议之间的相互作用。

我有一个 Web 服务,它接受格式良好的 XML 1.0 文档,对其进行解析,然后将其重新序列化回客户端。该服务同时支持 Content-Type text/xmlapplication/xml

假设以下文档以Content-Type: text/plain; charset=us-asciiAccept: text/plainAccept-Charset: us-ascii 提交:

<?xml version="1.0" encoding="UTF-8" ?>
<x>Inhoffenstra&#x00DF;e</x>

以上文档格式正确,满足编码要求。

解析后,XML DOM 为 UTF-8。由于文档的编码也是 UTF-8,所以文档会被重新序列化为:

<?xml version="1.0" encoding="UTF-8" ?>
<x>Inhoffenstraße</x>

上述文档与Accept-Charset 标头不兼容。但是,至少可以通过三种方式满足此请求:

  1. 使用编码 US-ASCII 序列化 DOM。这似乎是错误且不必要的,因为我正在更改文档的基本属性,这可能会误导客户端(例如,这会破坏应用层的某些东西,即 ESB/SOAP):

    <?xml version="1.0" encoding="US-ASCII" ?>
    <x>Inhoffenstra&#x00DF;e</x>
    
  2. 通过将非 ASCII 字符替换为其 Unicode 字符引用,对服务层中的序列化 UTF-8 进行后处理。这感觉像是一种 hack,因为 XML 特定的字符编码正在使用非 XML 感知的字符串转换对整个文档执行:

    <?xml version="1.0" encoding="UTF-8" ?>
    <x>Inhoffenstra&#x00DF;e</x>
    
  3. 拒绝服务层的请求为406 Not Acceptable。这将假定encoding="UTF-8"Accept-Charset: us-ascii 冲突。但是,我认为情况并非如此,因为请求的实际 content 完全由 ASCII 字符组成。

响应的预期、符合标准的行为是什么?根据我对参考标准的理解,以上任何一项都可能是可以接受的。

以下对不同问题的回答提供了一些有用的信息,但并未具体解决 text/xml 案例:

application/* Content-Type and charset attributes

我链接以下问题是因为我认为它源于一个相关问题:

Escaping Unicode string in XmlElement despite writing XML in UTF-8

【问题讨论】:

  • 如果您说该服务接受text/xmlapplication/xml,为什么要以text/plain 提交?

标签: xml http utf-8 character-encoding xml-serialization


【解决方案1】:

简答

由于请求中支持的媒体类型(文本/xml、应用程序/xml)与有效负载的媒体类型(文本/纯文本)之间存在冲突,所呈现场景的符合标准的响应是 415 Unsupported Media Type .

说明

Content-Type 在RFC7231 Section 3.1.1.5 中定义如下(强调我的):

“Content-Type”标头字段表示媒体类型 相关表示:包含在 消息有效负载或选定的表示,由 消息语义。指示的媒体类型定义了数据 格式以及接收者打算如何处理该数据, 在接收到的消息语义范围内,在任何内容之后 Content-Encoding 指示的编码被解码。

因为负载的媒体类型是文本/纯文本,我们必须将提交的文档处理为纯文本(“该数据打算如何处理”)。

那么我们如何处理纯文本呢? 纯文本在RFC2046 Section 4.1中定义如下:

纯文本不提供或允许 格式化命令、字体属性规范、处理 说明、解释指令或内容标记。清楚的 文本被简单地视为字符的线性序列,可能 被换行符或分页符打断。

XML 定义内容标记、处理指令和其他内容。 将纯文本文档解析为 XML 是违反标准的。

让我们看看你的例子:

<x>Inhoffenstra&#x00DF;e</x>

&amp;#x00DF; 转换为ß 是如果文档是XML,你会做的, 但如果文档是纯文本,则违反 RFC2046 和 RFC5147 确认应如何处理纯文本。 作为纯文本,&amp;#x00DF; 表示 &amp;#x00DF;,仅此而已。

总而言之,您提供的上述可能响应均不符合标准。 所呈现场景的符合标准的响应是 415 Unsupported Media Type。

【讨论】:

    猜你喜欢
    • 2018-08-30
    • 2012-02-23
    • 1970-01-01
    • 1970-01-01
    • 2020-03-22
    • 2015-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多