最近,我切换到使用德尔菲XE7中包含的XE7,以允许针对iOS。XML数据来自云服务,包括具有base64编码的二进制数据的节点。
现在,我在调用"Invalid Unicode Character value for this platform"时得到了这个exeception XMLDocument.LoadFromStream,并且似乎是这个base64换行序列失败了:
具有base64数据的节点看起来类似于以下内容:
<data>TVRMUQAAAAIAAAAAFFo3FAAUAAEA8AADsAAAAEAAAABAAHAAwABgAAAAAAAAAAAQEBAAAAAAAA
AAMQAAABNUgAAP/f/AAMABAoAAAAEAAAAAEVNVExNAAAAAQAAAAAUWjcUABQAAQD/wAA
AAA=</data>我把它追溯到XML.Internal.OmniXML中的这些行
psCharHexRef:
if CharIs_WhiteSpace(ReadChar) then
raise EXMLException.CreateParseError(INVALID_CHARACTER_ERR, MSG_E_UNEXPECTED_WHITESPACE, [])
else
begin
case ReadChar of
'0'..'9': CharRef := LongWord(CharRef shl 4) + LongWord(Ord(ReadChar) - 48);
'A'..'F': CharRef := LongWord(CharRef shl 4) + LongWord(Ord(ReadChar) - 65 + 10);
'a'..'f': CharRef := LongWord(CharRef shl 4) + LongWord(Ord(ReadChar) - 97 + 10);
';':
if CharIs_Char(Char(CharRef)) then
begin
Result := Char(CharRef);
Exit;
end
else
raise EXMLException.CreateParseError(INVALID_CHARACTER_ERR, MSG_E_INVALID_UNICODE, []);这是最后一行中的异常,因为CharIs_Char(#13)是false (其中#13是从
读取的CharRef的值)。
我该怎么解决这个问题?
发布于 2015-05-04 16:13:40
这显然是OmniXML中的一个bug。看起来,开发人员试图实现XML1.0 哪个州:
...XML处理器必须接受为Char指定范围内的任何字符。 字符范围 2 ::= #x9 #xA #xD #x20-#xD7FF #xA 000-#xFFFD#x10000-#x10 FFFF /*任何Unicode字符,不包括代理项块、FFFE和FFFF。*/
但是,CharIs_Char的实现如下所示:
function CharIs_Char(const ch: Char): Boolean;
begin
// [2] Char - any Unicode character, excluding the surrogate blocks, FFFE, and FFFF
Result := not Ch.IsControl;
end;这不包括所有控制字符,包括#x9(TAB)、#xA(LF)和#xD(CR)。事实上,由于XML条带(或可选择地用LF替换)在解析期间返回回文,因此包含实际回车的唯一方法是在实体值文字中使用字符引用(规范第2.3节)。
这似乎是一个展示,并应提交作为一份QC报告。
https://stackoverflow.com/questions/30033288
复制相似问题