从UnicodeString创建CData节点时XML无效字符

 mobiledu2502852753 发布于 2023-02-03 12:15

IDE:Embarcadero XE5 c ++构建器。

我试图在XML CData 节中转储UnicodeStrings

这样的字符串的小摘录:

 u"‰PNG\r\n\x1A\n\0\0\0\rIHDR\0\0\0õ\0\0\02\b\x06\0\0\0„\\i\0\0\0\x01sRGB\0®Î\x1Cé\0\0\0\x04gAMA\0\0±\vüa\x05\0\0\0\tpHYs\0\0\x0EÃ\0\0\x0EÃ\x01Ço¨d\0\0\v¼IDATxÚíœypUÕ\x19ÀO\x06…°¤\x04D$ˆ²\b1š\b\x18@...etc"

我知道一个XML文档可以包含非ASCII字符,并且我认为XML解析器无法解析XML CData节的内容(节末尾指示符“ [[> ” 除外)不存在在我的数据中进行检查)。

创建(写入)CDATA节,我仍然得到“ 无效字符在文本内容创建节点时被发现的错误”。

代码示例:

_di_IXMLDocument pXMLDocument = NewXMLDocument("1.0");
// I've played around with the document encoding with no success, guessing it's only applicable while reading the document.
// pXMLDocument->SetEncoding(L"iso-8859-1"); 

String myString;   // Unicode, contains my data string.

// 1st param of CreateNode method is of type UnicodeString.
di_IXMLNode pCDataNode = pXMLDocument->CreateNode( myString, ntCData ); 

有什么想法为什么会失败?编码有问题吗?

1 个回答
  • 如果你读第2.7节中的XML规范,它描述了一个CDATA节的格式:

    CDATA Sections
    
    [18]    CDSect    ::=    CDStart CData CDEnd  
    [19]    CDStart    ::=    '<![CDATA[' 
    [20]    CData    ::=    (Char* - (Char* ']]>' Char*))  
    [21]    CDEnd    ::=    ']]>' 
    

    Char在第2.2节中定义:

    Char    ::=    #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] /* any Unicode character, excluding the surrogate blocks, FFFE, and FFFF. */ 
    

    如果你看看你的原始数据,它包含了被排除在范围(特别是十几个字符值#x0#x1#x2#x4#x5#x6#x8#xB #xE#x18#x19#x1A,和#x1C)。这就是为什么您会收到有关非法字符的错误的原因,因为您确实确实有非法字符。

    CDATA部分不允许您将任意二进制数据放入XML数据。当文本内容包含通常为XML标记保留的字符时,将使用CDATA节,从而不必将其转义或编码为实体。将二进制数据放入XML文档的唯一方法是将其编码为XML兼容(通常为7位ASCII)格式,例如Base64(但是可以使用其他可用格式,例如yEnc)。

    2023-02-03 12:17 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有