使用具有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();