xml - 传输编码对 XML 编码和字符引用的影响

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

这个问题涉及 XML 1.0 之间的相互作用和 HTTP 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 header 不兼容。但是,至少可以通过三种方式来满足此请求:

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

    <?xml version="1.0" encoding="US-ASCII" ?>
    <x>Inhoffenstra&#x00DF;e</x>
    
  2. 通过用 Unicode 字符引用替换非 ASCII 字符,在服务层中对序列化的 UTF-8 进行后处理。这感觉就像是黑客攻击,因为 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 冲突。但是,我认为情况并非如此,因为请求的实际内容完全由 ASCII 字符组成。

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

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

application/* Content-Type and charset attributes

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

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

最佳答案

简短回答

由于请求中支持的媒体类型(text/xml、application/xml)与负载的媒体类型(text/plain)之间存在冲突,所呈现场景的符合标准的响应为 415 Unsupported Media Type .

说明

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

The "Content-Type" header field indicates the media type of the associated representation: either the representation enclosed in the message payload or the selected representation, as determined by the message semantics. The indicated media type defines both the data format and how that data is intended to be processed by a recipient, within the scope of the received message semantics, after any content codings indicated by Content-Encoding are decoded.

由于有效负载的媒体类型是文本/纯文本,因此我们必须将提交的文档作为纯文本进行处理(“如何处理该数据”)。

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

Plain text does not provide for or allow formatting commands, font attribute specifications, processing instructions, interpretation directives, or content markup. Plain text is seen simply as a linear sequence of characters, possibly interrupted by line breaks or page breaks.

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

让我们看一下您的示例:

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

如果文档是 XML,则将 ß 转换为 ß, 但如果文档是纯文本,则违反了 RFC2046,并且也违反了 RFC5147这确认了应该如何处理纯文本。 作为纯文本,ß 表示 ß,仅此而已。

总而言之,您提出的上述可能答案都不符合标准。 所呈现场景的符合标准的响应是 415 不支持的媒体类型。

关于xml - 传输编码对 XML 编码和字符引用的影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36163830/

相关文章:

java - 像普通网页一样的整页 GWT 布局

python - 是否可以仅在本地主机上运行 python SimpleHTTPServer?

asp.net - 如果发送的 HTTP 请求具有 "Access-Control-Allow-Origin",我如何在 Fiddler 中查看

c# - Select 语句获取 byte[] 和字符串但不获取 XML

java - 将项目添加到 Android ListView

python - 什么是 unicode 字符串?

Windows 和 Linux 下将 UTF-16 转换为 UTF-8,用 C 语言

mysql utf-8奇怪的文本问题-排序、删除

c# - 读取xml属性

java - 我怎么能改变 "http.connection-manager.timeout"?