什么是非xml友好的utf-8字符?

时间:2015-04-16 15:43:21

标签: xml encoding utf-8

什么是破坏xml的utf-8字符。

我在xml中传递一个utf-8字符串,但我不确定这些字符是否会破坏xml。

3 个答案:

答案 0 :(得分:2)

UTF-8旨在永远打破ASCII或在这种情况下<>&的XML。它也不能吃XML字符。正常的7位ASCII绝不会出现在多字节序列中(因为高位为1)。

一个问题是文件开头的冗余BOM字符,零宽度空间(因此不可见)。用于检测UTF-8 / UTF-16LE / UTF-16BE,但有时XML解析将在BOM上失败。

删除字符串开头的BOM:

String xml = "...";
xml = xml.replaceFirst("^\uFEFF", "");

但是,也存在已弃用的Unicode字符,这些字符在XML中也已弃用: Characters not suitable for use with markup。 (更多与HTML相关。)

然后有高于1.0的XML,可能在标记名称中包含Unicode。在这里建议使用规范版本,如何用重音组成字母。

例如,Unicode字母ĉ可以是一个单独的char c-circumflex:“\ u0109”或两个字符,c和组合 - 变音标记抑扬符“c \ u0302”。由于人们不会看到差异,因此规范化似乎是有序的。

xml = java.text.Normalizer.normalize(xml, Normalizer.Form.NFKC);

答案 1 :(得分:2)

XML建议states which characters可以在XML文档中使用。基本上它不允许所有控制字符(tab,换行和回车除外),代理块和U + FFFE以及U + FFFF。

请注意,元素和属性名称有一些extra restrictions,例如,它们不允许使用多个标点字符。 XML名称上有more specific answer

答案 2 :(得分:0)

你是从错误的角度看待这个。这不是UTF-8序列将破坏XML的问题。 UTF-8只是一种编码方案,XML规范不处理编码,而是处理Unicode代码点。事实上,XML可以用UTF-8编码,但这又是一种编码方案,而不是处理方案。

所以真正的问题是:

  

从UTF-8字符串解码时,哪些Unicode代码点会破坏XML。

XML spec本身清楚地描述了答案,其中概述了XML的各个部分中允许和限制的代码点。例如:

Text characters定义为:

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

...

     

注意:

     

鼓励文档作者避免使用[Unicode]第2.3节中定义的&#34;兼容性字符&#34;。还不鼓励在以下范围中定义的字符。它们是控制字符或永久未定义的Unicode字符:

[#x7F-#x84], [#x86-#x9F], [#xFDD0-#xFDEF],
[#x1FFFE-#x1FFFF], [#x2FFFE-#x2FFFF], [#x3FFFE-#x3FFFF],
[#x4FFFE-#x4FFFF], [#x5FFFE-#x5FFFF], [#x6FFFE-#x6FFFF],
[#x7FFFE-#x7FFFF], [#x8FFFE-#x8FFFF], [#x9FFFE-#x9FFFF],
[#xAFFFE-#xAFFFF], [#xBFFFE-#xBFFFF], [#xCFFFE-#xCFFFF],
[#xDFFFE-#xDFFFF], [#xEFFFE-#xEFFFF], [#xFFFFE-#xFFFFF],
[#x10FFFE-#x10FFFF].

Whitespace characters定义为:

S    ::=    (#x20 | #x9 | #xD | #xA)+ 

Name and token characters定义为:

NameStartChar    ::=    ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF] 

     NameChar    ::=    NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040] 

仅举几例。文字,评论,字符数据,处理指令,CData部分等中的字符有更多定义等。

因此,您需要阅读XML规范,以了解XML中任何给定上下文中允许哪些Unicode代码点。关于什么是可接受的和不可接受的,不同的部分和语法元素有不同的规则。