2

ASCII に最適な XML シリアライザーがありますが、ASCII 以外の文字が検出されると、疑問符「?」に置き換えられます。UTF8 用に正しく構成されていると思いますが、なぜこれを行っているのかわかりません。

XmlSerializer xmls = new XmlSerializer(typeof(T));
using (MemoryStream ms = new MemoryStream())
{
    XmlWriterSettings settings = new XmlWriterSettings();
    XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
    ns.Add("", "");

    settings.Encoding = Encoding.UTF8;
    settings.Indent = true;
    settings.NewLineChars = "\n";
    settings.NewLineHandling = NewLineHandling.None;
    settings.NewLineOnAttributes = false;
    settings.ConformanceLevel = ConformanceLevel.Document;
    settings.OmitXmlDeclaration = true;

    using (XmlWriter writer = XmlTextWriter.Create(ms, settings))
    {
        xmls.Serialize(writer, obj, ns);
    }

    string xml = Encoding.UTF8.GetString(ms.ToArray());

    // remove the BOM character at the beginning which screws up decoding
    if (xml.Length > 0 && xml[0] != '<')
    {
        xml = xml.Substring(1, xml.Length - 1);
    }

    return xml;
}
4

1 に答える 1

5

ここではすべて問題ないようです。でテスト済み

public class Foo
{
    public string Bar { get; set; }
}
...
string xml = Test(new Foo { Bar = "Jalapeño" });

出力:

<Foo>
  <Bar>Jalapeño</Bar>
</Foo>

マイナーな変更として、「BOM 文字を削除する」コードを完全に削除し、エンコーディングで明示的に行いました。

settings.Encoding = new UTF8Encoding(false);

さらに、xml 宣言を含めて、使用していると思われるエンコーディングを確認すると、次のようになります。

<?xml version="1.0" encoding="utf-8"?>
<Foo>
  <Bar>Jalapeño</Bar>
</Foo>

基本的に...再現できません。

于 2012-10-27T21:28:44.317 に答える