18

我在使用 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();

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

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

4

6 回答 6

13

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

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

  1. 确保您使用的 StreamReader 和 StreamWriter 对象使用与 XmlWriter 使用的编码相同的编码(不仅仅是 StreamWriter,就像其他人建议的那样),或者

  2. 不要使用 StreamReader/StreamWriter。相反,只需使用简单的 byte[] 和 Stream.Read/Write 在字节级别复制流。顺便说一句,无论如何,这将变得更有效率。

于 2008-09-26T13:05:52.307 回答
13

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

正如 tomasr 所说,使用 FileStream 开始会更简单 - 而且 MemoryStream 有方便的“WriteTo”方法,可以让您非常轻松地将其复制到 FileStream。

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

乔恩

于 2008-09-26T13:16:16.417 回答
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();
于 2008-09-26T13:51:02.027 回答
5

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

如果您没有Encoding为这种转换指定 an,UTF-8则使用默认值 - 这可能与您的场景匹配,也可能不匹配。您还通过将数据推入 a 然后再推入 a 来不必要地转换MemoryStream数据FileStream

如果您的原始数据不是UTF-8,那么这里会发生的情况是,第一次转换到MemoryStream将尝试使用默认值进行解码Encoding-UTF-8并因此损坏您的数据。然后,当您写出默认情况下FileStreamUTF-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();
于 2012-11-23T22:04:35.843 回答
3

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

是否有理由使用这种特定的编码,而不是例如 UTF8?

于 2008-09-26T12:55:04.237 回答
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");
于 2016-02-18T19:41:40.437 回答