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

时间:2016-03-22 19:48:10

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

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

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

假设以Content-Type: text/plain; charset=us-asciiAccept: text/plain Accept-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进行后处理。这感觉就像一个黑客,因为正在使用非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字符组成。

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

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

    application/* Content-Type and charset attributes

    我正在链接以下问题,因为我认为它源于一个相关的问题:

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

1 个答案:

答案 0 :(得分:2)

简短答案

由于支持的媒体类型(文本/ xml,应用程序/ xml)与请求中有效负载的媒体类型(文本/纯文本)之间的冲突,因此,本演示场景的符合标准的响应为415不支持的媒体类型

说明

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

  

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

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

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

  

纯文字不提供或不允许   格式化命令,字体属性规范,处理   说明,解释指令或内容标记。平原   文本仅被视为线性字符序列,可能   被换行符或分页符中断。

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

让我们看看您的示例:

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

如果文档是XML,则将&#x00DF;转换为ß, 但是如果文档是纯文本,则违反RFC2046,也违反了RFC5147,该文本确认应如何处理纯文本。 作为纯文本,&#x00DF;的意思是&#x00DF;

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