これらのxmlエンコードの問題を理解できない
-
05-07-2019 - |
質問
次の大量のコード(簡潔にするために抜粋)は、xmlドキュメントを生成し、それをファイルに出力します。 Visual Studioでファイルを開くと、中国語の文字が表示されます。メモ帳で開くと、期待どおりに見えます。 Console.WriteLineが正しいように見えます。
エンコードに関連していることは知っていますが、すべてのエンコードアヒルが一列に並んでいました。何が欠けているのですか?
StringBuilder stringBuilder = new StringBuilder();
XmlWriterSettings settings = new XmlWriterSettings();
settings.Encoding = Encoding.Unicode;
settings.Indent = true;
settings.IndentChars = "\t";
using (XmlWriter textWriter = XmlWriter.Create(new StringWriter(stringBuilder), settings))
{
textWriter.WriteStartElement("Submission");
textWriter.WriteAttributeString("xmlns", "xsi", null, "http://www.w3.org/2001/XMLSchema-instance");
textWriter.WriteEndElement();
}
using (StreamWriter sw = new StreamWriter(new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.None)))
{
sw.Write(stringBuilder.ToString());
}
解決
問題は、UTF-8を使用して disk に書き込みますが、 StringWriterであるため、 claim がUTF-16であることです
はデフォルトで使用します-また、 Encoding.Unicode
も使用するように明示的に設定しているためです。
これを修正する最も簡単な方法は、UTF-8として自分自身をアドバタイズするStringWriterを使用することです:
public class Utf8StringWriter : StringWriter
{
public override Encoding
{
get { return Encoding.UTF8; }
}
}
...そして、 settings.Encoding = Encoding.Unicode
行を削除します。そのようにして、全体でUTF-8を使用します。 (実際、 XmlWriterSettings
の Encoding
プロパティは、 TextWriter
を使用して XmlWriter
を作成すると無視されます。)
UTF-16を本当に したい場合は、 StreamWriter
を作成するときに、 Encoding.Unicode
も指定します。
他のヒント
Encoding.Unicode
が何なのかわかりませんが、文字ごとに2バイトをファイルに書き込むUTF-16であると思います。通常のASCIIテキストの場合、バイトの1つは常に0です。
代わりに UTF-8
を試してください。これは、特殊文字(コードポイント> = 128)を使用しない限り、どのエディターでも同じように見えるはずです。