【问题标题】:Including UTF-8 characters in XML CDATA for Exchange Web Services在用于 Exchange Web 服务的 XML CDATA 中包含 UTF-8 字符
【发布时间】:2021-01-20 22:37:40
【问题描述】:

我正在使用 EWS 在 Microsoft 365 中创建日历条目。我正在直接进行 http 调用并创建自己的 XML 文件,不涉及任何库。在日历对象的主体(即注释)中,我需要包含特殊字符的 UTF-8 序列。我以为我有这个工作,但现在包含这样的编码会生成 http 错误 500,并显示数据未通过架构验证的消息。

下面是我正在创建的 XML 示例。在我指出 XYZ 的地方,假设这些是 3 个字节 xE2、x82、xAC,它们是欧元字符的编码。这验证失败。如果我删除这 3 个字节,它工作正常。请注意,XML 指定了 UTF-8 编码。我还在 http 标头中设置了“Content-Type: text/xml; charset=utf-8”。知道如何指定 EWS 应处理 UTF-8 字符吗?

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
<soap:Header>
<t:RequestServerVersion Version="Exchange2010_SP1"/>
</soap:Header>
<soap:Body>
<CreateItem SendMeetingInvitations="SendToNone" xmlns="http://schemas.microsoft.com/exchange/services/2006/messages"
xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
<SavedItemFolderId>
<t:FolderId Id="AAMkADNjNjA1MTIxLWNlNmItNDBjMS04NWE0LTQ3ZmM0YTFiMTg4MAAuAAAAAADzAjMnWlbcRo51UWjY2+udAQBtGm0AIaIyTp7trMMKSGyiAAAAzNL0AAA="/>
</SavedItemFolderId>
<Items>
<t:CalendarItem>
<t:Subject>Test Euro character</t:Subject>
<t:Body BodyType="Text">
<![CDATA[
This is a Euro character: XYZ
]]>
</t:Body>
<t:Importance>Normal</t:Importance>
<t:ReminderIsSet>false</t:ReminderIsSet>
<t:Start>2010-08-24T14:30:00Z</t:Start>
<t:End>2010-08-24T15:00:00Z</t:End>
<t:LegacyFreeBusyStatus>Busy</t:LegacyFreeBusyStatus>
<t:Location></t:Location>
</t:CalendarItem>
</Items>
</CreateItem>
</soap:Body>
</soap:Envelope>

【问题讨论】:

    标签: xml soap utf-8 exchangewebservices


    【解决方案1】:

    只需输入实际字符。 CDATA 部分有 character 数据,而不是编码字节数据。例如,我在 Notepad++ 中创建了以下内容,并将文件保存为 UTF-8:

    <t:Body><![CDATA[This is a Euro character: €]]></t:Body>
    

    文件的十六进制转储:

    如果您仍有问题,请发布用于构建 XML 的代码。如果不使用库,很容易违反 XML 标准。使用 hexdump 程序,看看你的文件与这个例子相比有什么问题。

    此数据中没有任何内容可以使用 CDATA,因此您可以使用:

    <t:Body>This is a Euro character: €</t:Body>
    

    【讨论】:

    • 我认为这就是我已经在做的事情 - 当我对 xml 文件进行十六进制转储时,我看到了您在示例中显示的确切内容。我可以在某处上传 .xml 文件的二进制文件供您确认它是否正确吗?
    • @JeffMcKay 当然,我可以检查一下。您还说它未通过验证。你有模式吗?什么是验证错误?
    • 这毕竟可能是我自己的问题 - 我实际上无法通过单个欧元字符示例重现该问题。我有一些代码可以过滤掉一些导致架构验证的问题线条绘制字符,并且我认为该代码也会破坏有效的 UTF-8 序列。我需要重新审视整个问题,所以我要关闭它。感谢您的帮助。
    猜你喜欢
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-05
    • 2019-09-22
    • 2012-09-23
    • 1970-01-01
    相关资源
    最近更新 更多