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

时间:2020-03-06 14:46:54  来源:igfitidea点击:

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

现在的问题是,在此文件中,所有挪威语字符看起来都很可笑。

我可能以某种愚蠢的方式进行了上述操作。关于如何解决它的任何建议?

解决方案

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

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

为什么先将XML写入MemoryStream,然后再将XML写入实际的文件流?那是非常低效的。如果我们直接写入FileStream,它应该可以工作。

如果仍然出于任何原因想要重复写入,请执行以下两项操作之一。任何一个

  • 确保所有使用的StreamReader和StreamWriter对象都使用与XmlWriter相同的编码(不仅仅是像其他建议的StreamWriter),或者
  • 不要使用StreamReader / StreamWriter。相反,只需使用简单的byte []和Stream.Read/Write在字节级别复制流。顺便说一句,这将使效率提高很多。

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

正如tomasr所说,使用FileStream开头会更简单,但MemoryStream还具有方便的" WriteTo"方法,使我们可以非常轻松地将其复制到FileStream。

我希望我们在真实的代码中有一个using语句,这样一来,如果我们在写文件时出问题了,就不想让文件句柄保持打开状态。

乔恩

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

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();