2009-05-14 2 views
6

I次のコードを持っている:のXmlWriterエンコーディングが発行

MemoryStream ms = new MemoryStream(); 
    XmlWriter w = XmlWriter.Create(ms); 

    w.WriteStartDocument(true); 
    w.WriteStartElement("data"); 

    w.WriteElementString("child", "myvalue"); 

    w.WriteEndElement();//data 
    w.Close(); 
    ms.Close(); 

    string test = UTF8Encoding.UTF8.GetString(ms.ToArray()); 

XMLが正しく生成されます。しかし、私の問題は文字列 'test'の最初の文字はï(char#239)なので、それはいくつかのxmlパーサーにとって無効になっています。正確に私は間違って何をしていますか?

私は最初の文字の後にちょうど始めることで問題を解決できると知っていますが、問題の原因を単純に突き止めるよりも、その理由を知りたいと思います。

ありがとうございます!

答えて

13

がここに一つの解決策が見つかりました: http://www.timvw.be/generating-utf-8-with-systemxmlxmlwriter/

私がトップでこれを欠けていた:ヘルプ皆のため

XmlWriterSettings xmlWriterSettings = new XmlWriterSettings(); 
xmlWriterSettings.Encoding = new UTF8Encoding(false); 
MemoryStream ms = new MemoryStream(); 
XmlWriter w = XmlWriter.Create(ms, xmlWriterSettings); 

感謝を!

+2

+1 BOMはもう一度私を連れて来ました。ありがとう。 – bendewey

+0

BOMは毎回私を受け取ります...デフォルトのEncoding.UTF8にはBOMが含まれています。 –

0

あなたはこのようにエンコーディングを変更することができます。

w.Settings.Encoding = Encoding.UTF8; 
+0

で2つのスニペットを持っています。私はそれが動作するとは思わない – John

+0

本当ですか? MSDNを見るとプロパティは両方のget/setをサポートしていますが、試してみませんでした。私はそれがそこにあることを知っています:/ – Lloyd

+0

それを設定することができます。しかし、それは実行時エラー(コンパイルエラーではない) – John

2

問題作家によって生成されたあなたのXMLがあるということであるUTF- 16をUTF-8を使用して文字列に変換します。代わりにこれを試してみてください:

StringBuilder sb = new StringBuilder(); 
using (StringWriter writer = new StringWriter(sb)) 
using (XmlWriter w = XmlWriter.Create(writer)) 
{ 
    w.WriteStartDocument(true); 
    w.WriteStartElement("data"); 

    w.WriteElementString("child", "myvalue"); 

    w.WriteEndElement();//data 
} 

string test = sb.ToString(); 
+0

UTF-8の理由は、xmlwriterに 'encoding = utf8'を出力させることでした。 – John

0

編集者が使用するバイトオーダーマーク(Visual StudioがUTF8エンコードされたXMLと構文の強調表示を適切に検出しているなど)を気にしている場合、これらはすべてオフになります。

ここソリューションです:

MemoryStream stream = new MemoryStream(); 

XmlWriterSettings settings = new XmlWriterSettings(); 
settings.Encoding = Encoding.UTF8; 
settings.Indent = true; 
settings.IndentChars = "\t"; 

using (XmlWriter writer = XmlWriter.Create(stream, settings)) 
{ 
    // ... write 

    // Make sure you flush or you only get half the text 
    writer.Flush(); 

    // Use a StreamReader to get the byte order correct 
    StreamReader reader = new StreamReader(stream,Encoding.UTF8,true); 
    stream.Seek(0, SeekOrigin.Begin); 
    result = reader.ReadToEnd(); 
} 

私は.Settings.Encodingが読み取り専用のフルhere