使用带有ISO-8859-1编码的XmlTextWriter编写XML文件

时间:2008-09-26 12:50:47

标签: c# .net xml encoding iso-8859-1

我在使用C#将挪威字符写入XML文件时遇到问题。我有一个包含一些挪威文字的字符串变量(字母像æøå)。

我正在使用XmlTextWriter编写XML,将内容写入MemoryStream,如下所示:

MemoryStream stream = new MemoryStream();
XmlTextWriter xmlTextWriter = new XmlTextWriter(stream, Encoding.GetEncoding("ISO-8859-1"));
xmlTextWriter.Formatting = Formatting.Indented;
xmlTextWriter.WriteStartDocument(); //Start doc

然后我添加我的挪威文字:

xmlTextWriter.WriteCData(myNorwegianText);

然后我将文件写入磁盘:

FileStream myFile = new FileStream(myPath, FileMode.Create);
StreamWriter sw = new StreamWriter(myFile);

stream.Position = 0;
StreamReader sr = new StreamReader(stream);
string content = sr.ReadToEnd();

sw.Write(content);
sw.Flush();

myFile.Flush();
myFile.Close();

现在的问题是,在这个文件中,所有挪威字符看起来都很有趣。

我可能会以某种愚蠢的方式做上述事情。有关如何修复它的任何建议吗?

6 个答案:

答案 0 :(得分:13)

为什么要先将XML写入MemoryStream,然后将其写入实际的文件流?那效率很低。如果直接写入FileStream,它应该可以工作。

如果您仍然想要进行双重写入,无论出于何种原因,请执行以下两项操作之一。任

  1. 确保您使用的 all 的StreamReader和StreamWriter对象使用相同的编码,就像您使用XmlWriter一样(不仅仅是StreamWriter,如别人建议的),或

  2. 不要使用StreamReader / StreamWriter。而是使用简单的byte []和Stream.Read/Write在字节级复制流。无论如何,这将是更高效的。

答案 1 :(得分:13)

您的StreamWriter和StreamReader都使用UTF-8,因为您没有指定编码。这就是事情变得腐败的原因。

正如tomasr所说,使用FileStream开始会更简单 - 而且MemoryStream还有一个方便的“WriteTo”方法,可以让你很容易地将它复制到FileStream。

顺便说一下,我希望你的实际代码中有一个using语句 - 如果你在写文件时出错,你不想让文件句柄保持打开状态。

乔恩

答案 2 :(得分:8)

每次编写字符串或将二进制数据读取为字符串时,都需要设置编码。

    Encoding encoding = Encoding.GetEncoding("ISO-8859-1");

    FileStream myFile = new FileStream(myPath, FileMode.Create);
    StreamWriter sw = new StreamWriter(myFile, encoding);

    stream.Position = 0;
    StreamReader sr = new StreamReader(stream, encoding);
    string content = sr.ReadToEnd();

    sw.Write(content);
    sw.Flush();

    myFile.Flush();
    myFile.Close();

答案 3 :(得分:5)

正如上面的答案中所提到的,这里最大的问题是Encoding,由于未指定而被默认。

如果您没有为此类转换指定Encoding,则会使用默认值UTF-8 - 这可能与您的方案匹配,也可能不匹配。您也是通过将数据推送到MemoryStream然后转到FileStream来不必要地转换数据。

如果您的原始数据不是UTF-8,那么此处会发生的事情是,MemoryStream的第一次转换会尝试使用Encoding的默认UTF-8进行解码 - 并且结果损坏了您的数据。然后,当您写出FileStream时,默认情况下也使用UTF-8作为编码,您只需将该损坏保留在文件中。

要解决此问题,您可能需要在Encoding个对象中指定Stream

您实际上可以完全跳过MemoryStream进程 - 这将更快,更高效。您更新的代码可能更像是:

FileStream fs = new FileStream(myPath, FileMode.Create);

XmlTextWriter xmlTextWriter = 
    new XmlTextWriter(fs, Encoding.GetEncoding("ISO-8859-1"));

xmlTextWriter.Formatting = Formatting.Indented;
xmlTextWriter.WriteStartDocument(); //Start doc

xmlTextWriter.WriteCData(myNorwegianText);

StreamWriter sw = new StreamWriter(fs);

fs.Position = 0;
StreamReader sr = new StreamReader(fs);
string content = sr.ReadToEnd();

sw.Write(content);
sw.Flush();

fs.Flush();
fs.Close();

答案 4 :(得分:3)

您使用哪种编码来显示结果文件?如果它不在ISO-8859-1中,它将无法正确显示。

是否有理由使用此特定编码,而不是UTF8?

答案 5 :(得分:0)

经过调查,这对我来说效果最好:

var doc = new XDocument(new XDeclaration("1.0", "ISO-8859-1", ""));
        using (XmlWriter writer = doc.CreateWriter()){
            writer.WriteStartDocument();
            writer.WriteStartElement("Root");
            writer.WriteElementString("Foo", "value");
            writer.WriteEndElement();
            writer.WriteEndDocument();
        }
        doc.Save("dte.xml");