在 Exchange Web 服务的 XML CDATA 中包含 UTF-8 字符

Including UTF-8 characters in XML CDATA for Exchange Web Services

我正在使用 EWS 在 Microsoft 365 中创建日历项。我正在直接调用 http 并创建我自己的 XML 文件,不涉及任何库。在日历 object 的 body(即注释)中,我需要为特殊字符包含 UTF-8 序列。我以为我有这个工作,但现在包括这样的编码会生成 http 错误 500,并显示数据模式验证失败的消息。

下面是我正在创建的 XML 的示例。在我指示 XYZ 的地方,假设这些是 3 个字节 xE2、x82、xAC,它们是欧元字符的编码。这验证失败。如果我删除这 3 个字节,它就可以正常工作。请注意,XML 指定 UTF-8 编码。我还在 http header "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>

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

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

文件的十六进制转储:

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

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

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