XmlReader 读取带有特殊符号Unicode 时的异常

本文探讨了XML中特殊Unicode字符的显示方式及其对XmlReader的影响,包括如何通过XmlReaderSettings来解决控制字符读取问题,并提供了ASCII控制字符的详细列表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    xml可以利用&#nnn;的格式显示特定的字符,nnn代表该字符的十进制Unicode代码,或者采用十六进制代码,在编码之前加上x字符即可(&#xnnn;)


    在ASCII中 十进制大于等于32(16进制大于等于20)的"可显示字符",在XmlReader中读取(Read或者ReadToFollowing)是没有问题的,
那么对于 十进制小于32(16进制小于20)的"控制字符",在XmlReader中读取过程中Read()时会忽略控制字符后面的内容,ReadToFollowing则会报异常。(这里十进制小于32的"控制字符"并不都会引起问题,那几个不会有问题大家可以自己试下)

要解决这个问题可以设置 XmlReaderSettings.CheckCharacters 属性(此属性在 .NET Framework 2.0 版中是新增的)
属性值:如果进行字符检查,则为 true;否则为 false。默认为 true。

下面是个简单的例子:
test.xml 文件内容

<Root>
<Content>&#xb;</Content>
<Content>Ohter string here.</Content>
</Root>

C#测试代码:

string filePath = @"You file dir\test.xml";
XmlReaderSettings xrs = new XmlReaderSettings();
xrs.CheckCharacters = false;
using (XmlReader reader = XmlReader.Create(filePath, xrs))
{
while (reader.ReadToFollowing("Content"))
{}
}

如果用XmlDocument读取这样的xml就没有问题,建议使用XmlReader的朋友留意下这个。

下面贴出ASCII的所有"控制字符"(来自维基百科)

二进制十进制十六进制缩写可以显示的表示法名称/意义
0000 0000000NUL空字符(Null)
0000 0001101SOH标题开始
0000 0010202STX本文开始
0000 0011303ETX本文结束
0000 0100404EOT传输结束
0000 0101505ENQ请求
0000 0110606ACK确认回应
0000 0111707BEL响铃
0000 1000808BS退格
0000 1001909HT水平定位符号
0000 1010100ALF换行键
0000 1011110BVT垂直定位符号
0000 1100120CFF换页键
0000 1101130DCREnter键
0000 1110140ESO取消变换(Shift out)
0000 1111150FSI启用变换(Shift in)
0001 00001610DLE跳出数据通讯
0001 00011711DC1设备控制一(XON 激活软件速度控制)
0001 00101812DC2设备控制二
0001 00111913DC3设备控制三(XOFF 停用软件速度控制)
0001 01002014DC4设备控制四
0001 01012115NAK确认失败回应
0001 01102216SYN同步用暂停
0001 01112317ETB区块传输结束
0001 10002418CAN取消
0001 10012519EM连接介质中断
0001 1010261ASUB替换
0001 1011271BESC退出键
0001 1100281CFS文件分区符
0001 1101291DGS组群分隔符
0001 1110301ERS记录分隔符
0001 1111311FUS单元分隔符
0111 11111277FDEL删除

 

 

转载于:https://www.cnblogs.com/debugdotnet/archive/2011/12/08/XmlReader_read_Special_Unicode_Use_XmlReaderSettings_CheckCharacters.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值