Очистка управляющих символов ASCII из вывода веб-службы - PullRequest
2 голосов
/ 13 июня 2011

У меня были некоторые трудности с текстом, который я получал от веб-службы, которую я недавно использовал.Веб-сервис отправляет обратно XML, что нормально, но мы получаем управляющие символы ASCII в середине некоторых XML.Я хотел вставить пример в эту публикацию, но, будучи недопустимым символом, я даже не могу вставить его в эту текстовую область.

Я потратил некоторое время на изучение того, что делать в этих случаях, и нашел эту информативную статью: http://seattlesoftware.wordpress.com/2008/09/11/hexadecimal-value-0-is-an-invalid-character/. Вот цитата из этой статьи, которая имеет отношение к делу:

Это не символы, которые имеют какое-либо отношение к данным XML;это недопустимые символы, которые должны быть удалены ...

Итак, следуя совету статьи, я написал некоторый код для извлечения необработанного вывода из этого сервиса и удаления его из любого символа, который являетсяуправляющий символ (и это не пробел, табуляция, кр или 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 ]

2 голосов
/ 13 июня 2011

Ну, код, который вы показали: , предполагая UTF-8 - который никогда не будет иметь ни одного из этих байтов в своих данных (кроме этих символов), из-заспособ, которым это разработано.Тем не менее, я бы рекомендовал текстовый подход вместо этого байтовый подход - я бы, вероятно, использовал DownloadString вместо DownloadData (и полагался на WebClient выбирая правильную кодировку), но затем очистите данные с помощью регулярного выражения, прежде чем анализировать их.

Я бы также связался с поставщиком веб-службы, чтобы объяснить, что они подают пустой XML ....

0 голосов
/ 02 июля 2011

Попробуйте следующее:

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