2

最近使用した Web サービスから受け取ったテキストに問題がありました。Web サービスは XML を送り返しますが、これは問題ありませんが、一部の XML の途中で ASCII 制御文字を取得しています。この投稿に例を貼り付けたかったのですが、無効な文字であるため、このテキストエリアに貼り付けることさえできません。

これらの場合に何をすべきかを調査するのに時間を費やしたところ、有益な記事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);

しかし、これは私に考えさせました。2 バイト文字を受け取った場合、返されたデータを台無しにすることはありますか? コードページによっては、1 バイトまたは 2 バイトの ASCII 制御文字で構成される 2 バイト文字を使用することは有効ですか? これらの文字が XML データにあると「何の役にも立たない」という記事は最終的なものに聞こえますが、セカンド オピニオンが必要です。

フィードバックをお待ちしております

4

2 に答える 2

2

さて、あなたが示したコードはUTF-8を想定しています.UTF-8は、その設計方法により、データにこれらのバイトが含まれることはありません(それらの文字以外)。ただし、このバイト駆動型のアプローチではなく、テキスト駆動型のアプローチをお勧めします。おそらく代わりに(そして正しいエンコーディングの選択に依存して) を使用しますが、解析する前に正規表現でデータをスクラブします。DownloadStringDownloadDataWebClient

また、Web サービス プロバイダーに連絡して、duff XML を提供していることを説明します...

于 2011-06-13T16:52:59.767 に答える
0

次のことを試してください。

byte[] byteArray = Encoding.ASCII.GetBytes( test ); 
MemoryStream stream = new MemoryStream( byteArray );    
stream.Position = 0;
StreamReader reader = new StreamReader( stream );            
string text = reader.ReadToEnd(); 
于 2011-07-01T21:08:50.647 に答える