6

次のコードがあります。

    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 パーサーでは無効になることです: これはどこから来たのですか? 私は正確に何を間違っていますか?

最初の文字の後に開始するだけで問題を解決できることはわかっていますが、単に問題にパッチを当てるよりも、なぜそこにあるのかを知りたいです。

ありがとう!

4

4 に答える 4

13

ここで 1 つの解決策を見つけました: https://timvw.be/2007/01/08/generating-utf-8-with-systemxmlxmlwriter/

上部にこれがありませんでした:

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

みんな助けてくれてありがとう!

于 2009-05-14T14:01:56.787 に答える
2

問題は、UTF-8 を使用して文字列に変換しているときに、ライターによって生成された XML が UTF-16 であることです。代わりにこれを試してください:

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();
于 2009-05-14T13:56:40.370 に答える
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();
}

ここに完全な2つのスニペットがあります

于 2009-06-02T15:44:24.443 に答える
0

次のようにエンコーディングを変更できます。

w.Settings.Encoding = Encoding.UTF8;
于 2009-05-14T13:54:39.113 に答える