xml 标准字符过滤

今天在代码里面看见一串很奇怪的判断语句

if (c < 0x9 || c > 0x9 && c < 0xA || c > 0xA && c < 0xD || c > 0xD && c

< 0x20 || c > 0xD7FF && c < 0xE000 || c > 0xFFFD)

于是用0xE000和0xFFFD 搜索了一下,发现原来xml还有这些限制。

根据xml spec

http://www.w3.org/TR/xml/#charsets

xml合法的字符范围是

[2] Char    ::=    #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]

然后有网上各种人遇到的问题

“因为字节数组中存在 Unicode: 0x0,而这个字节在Xml中被认为是非法字符。对于一些经过编码或加、解密的字符串中,很容易会出现这个 0x0,特别是在加、解密中,经常会涉及到字符填充,而填充物通常是 0x0,对于0x00-0x20 都会引起一定的问题,又因为这些字符不可见,因此用通常的编辑器进行编辑的时候找不到问题所在。

xml中需要过滤的字符分为两类:

一类是不允许出现在xml中的字符,这些字符不在xml的定义范围之内;

另一类是xml自身要使用的字符,如果内容中有这些字符则需被替换成别的字符。

第一类字符:

  对于第一类字符,我们可以通过W3C的XML文档来查看都有哪些字符不被允许出现在xml文档中。

  XML允许的字符范围是“#x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]”。因此我们可以把这个范围之外的字符过滤掉。

第二类字符:

  对于第二类字符一共有5个,如下:

  字符            HTML字符         字符编码

  和(and) &        &amp;               &

  单引号  ’       &apos;              '

  双引号  ”       &quot;              "

  大于号  >        &gt;                >

  小于号  <        &lt;                <

还有

解决openfire中发送某些特殊字符会断开xmpp连接的问题

以及emoji问题 http://blog.csdn.net/u014542833/article/details/22954893

这只能用一个非严格标准的xml解析器,或者用cdata包超出范围的字符了?

时间: 2024-10-09 12:44:43

xml 标准字符过滤的相关文章

java web过滤器实际应用(解决中文乱码 html标签转义功能 敏感字符过滤功能)

转载地址:http://www.cnblogs.com/xdp-gacl/p/3952405.html 在filter中可以得到代表用户请求和响应的request.response对象,因此在编程中可以使用Decorator(装饰器)模式对request.response对象进行包装,再把包装对象传给目标资源,从而实现一些特殊需求. 一.Decorator设计模式 1.1.Decorator设计模式介绍 当某个对象的方法不适应业务需求时,通常有2种方式可以对方法进行增强: 编写子类,覆盖需增强的

华为上机练习题--重复字符过滤

题目: 请编写一个字符串过滤程序,若字符串中出现多个相同的字符,将非首次出现的字符过滤掉. 比如字符串"abacacde"过滤结果为"abcde". 示例 输入:"deefd"        输出:"def" 输入:"afafafaf"     输出:"af" 输入:"pppppppp"     输出:"p" 分析: 看到这种类似的相同字符过滤,使

某游戏研究之字符过滤类-WorldFilter

所谓字符过滤器,常常用在聊天的内容,比如一连串的骂人难听的话,我们要屏蔽掉,避免造成不好的东西! 当然我作为中华天朝一个有文明有素质的人,肯定偶尔会做这样的事情啦,特别是打LOL的时候,算了不讲了,都是泪啊. 我们来看看这款游戏字符过滤是怎么实现的,结合我上节讲到的单例类,因为字符过滤类当然是个单例类. public class WordFilter : Singleton<WordFilter> { private string[] m_StringFilters; private Dict

华为-on练习--重复的字符过滤

称号: 请写一个字符串过滤程序,如果使用多个相同的字符出现在字符串中,字符首次出现在非过滤,. 比方字符串"abacacde"过滤结果为"abcde". 演示样例 输入:"deefd"        输出:"def" 输入:"afafafaf"     输出:"af" 输入:"pppppppp"     输出:"p" 分析: 看到这样的类似的同样字

java 非法字符过滤 , 半角/全角替换

java 非法字符过滤 , 半角/全角替换 package mjorcen.netty.test1; import java.io.UnsupportedEncodingException; public class CharByteConverter { /** * 全角转半角 * * @param str * @return * * @author mjorcen * @email [email protected] * @dateTime Sep 27, 2014 2:51:50 PM *

【异常处理】Incorrect string value: &#39;\xF0\x90\x8D\x83...&#39; for column... Emoji表情字符过滤的Java实现

Emoji表情字符现在在APP已经广泛支持了.但是Mysql的UTF8编码对Emoji字符的支持却不是那么好.所以我们经常会遇到这样的异常: Incorrect string value: '\xF0\x90\x8D\x83...' for column 原因是Mysql里UTF8编码最多只能支持3个字节,而Emoji表情字符使用的UTF8编码,很多都是4个字节,有些甚至是6个字节. 解决的方案有两种: 1.使用utf8mb4的mysql编码来容纳这些字符. 2.过滤掉这些特殊的表情字符. 关于

XML标准文件结构

一个XML文件通常包含文件头和文件体两大部分 1.         文件头 XML文件头由XML声明与DTD文件类型声明组成.其中DTD文件类型声明是可以缺少的,关于DTD声明将在后续的内容中介绍,而XML声明是必须要有的,以使文件符合XML的标准规格. 在前面的Flowers.xml文件中的第一行代码即为XML声明: <?xml version="1.0" encoding="gb2312"?> 其中: "<?"代表一条指令的

C++ 敏感字符过滤

WordNode.h #ifndef __TOOLS_WORDNODE_H_INCLUDE__ #define __TOOLS_WORDNODE_H_INCLUDE__ #include <map> class CWordNode { typedef std::map<std::string, CWordNode*> umap; public: CWordNode(const std::string& word) { Reset(word); } ~CWordNode()

字符过滤函数,过滤重复字符串

实际作用不大,有时会用到,留着作为以后参考.若有缘者看到,恳请提出优化方案 1 USE [master] 2 GO 3 /****** Object:  UserDefinedFunction [dbo].[CharFilter]    Script Date: 04/06/2016 17:20:16 ******/ 4 SET ANSI_NULLS ON 5 GO 6 SET QUOTED_IDENTIFIER ON 7 GO 8 --=============================