当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《使用带有ISO-8859-1编码的XmlTextWriter编写XML文件》经验,为你挑选了4个好方法。

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

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

我可能会以某种愚蠢的方式做上述事情.有关如何解决它的任何建议?



1> tomasr..:

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

如果你仍然想做双写,无论出于何种原因,做两件事之一.或

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

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


写入内存流的一个原因是因为这样做会产生原子动作.有关更多详细信息,请查看此文章:http://aspalliance.com/1012_how_to_write_atomic_transactions_in_net

2> Jon Skeet..:

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

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

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

乔恩



3> Thomas Danec..:

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

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



4> Troy Alford..:

正如上面的答案中所提到的,这里最大的问题是Encoding,由于未指明而被拖欠.

如果未指定Encoding此类转换,UTF-8则使用默认值- 可能与您的方案匹配也可能不匹配.您也可以通过将数据推入a MemoryStream然后输入到数据中来不必要地转换数据FileStream.

如果你的原始数据是不是UTF-8,有什么会发生在这里是第一过渡到MemoryStream将尝试使用默认解码EncodingUTF-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();

推荐阅读
小白也坚强_177
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有