从Web服务输出中清除ASCII控制字符

时间:2011-06-13 16:49:32

标签: c# xml encoding ascii codepages

我在最近消费的Web服务中收到的一些文本遇到了一些困难。 Web服务发回XML,这很好,但是我们在一些XML的中间获得了ASCII控制字符。我想在此帖子中粘贴一个示例但是无效字符,我甚至无法将其粘贴到此textarea中。

我花了一些时间研究在这些情况下该怎么做,我找到了这篇内容丰富的文章:http://seattlesoftware.wordpress.com/2008/09/11/hexadecimal-value-0-is-an-invalid-character/。以下是本文引用的相关内容:

  

这些不是任何字符   业务在XML数据中;他们是   应该是非法字符   除去...

所以,按照文章的建议,我已经编写了一些代码来获取此服务的原始输出并删除任何作为控制字符的字符(并且不是空格,制表符,cr或lf)

以下是代码:

System.Net.WebClient client = new System.Net.WebClient();

byte[] invalidCharacters = { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0xB, 
                             0xC, 0xE, 0xF, 0x10, 0x11, 0x12, 0x14, 0x15, 0x16, 
                             0x17, 0x18, 0x1A, 0x1B, 0x1E, 0x1F, 0x7F };

byte[] sanitizedResponse = (from a in client.DownloadData(url)
                            where !invalidCharacters.Contains(a)
                            select a).ToArray();

result = System.Text.UTF8Encoding.UTF8.GetString(sanitizedResponse);

这让我想到了。如果我收到双字节字符,我会搞砸我收到的任何数据吗?某些代码页是否有效的双字节字符由一个或两个单字节ASCII控制字符组成?文章说这些字符在XML数据中“没有业务”听起来是最终的,但我想要第二个意见。

感谢任何反馈

2 个答案:

答案 0 :(得分:2)

嗯,您显示的代码是假设 UTF-8 - 其数据中永远不会有任何字节(除了那些字符),由于它的设计方式。但是,我鼓励使用文本驱动的方法而不是字节驱动的方法 - 我可能会使用DownloadString而不是DownloadData (并依赖WebClient选择正确的编码),然后在解析之前用正则表达式清理数据。

与网络服务提供商联系,说明他们正在提供duff XML ...

答案 1 :(得分:0)

尝试以下方法:

byte[] byteArray = Encoding.ASCII.GetBytes( test ); 
MemoryStream stream = new MemoryStream( byteArray );    
stream.Position = 0;
StreamReader reader = new StreamReader( stream );            
string text = reader.ReadToEnd();