我在使用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();
现在的问题是,在这个文件中,所有的挪威字符看起来都很有趣.
我可能会以某种愚蠢的方式做上述事情.有关如何解决它的任何建议?
为什么要先将XML写入MemoryStream,然后将其写入实际的文件流?那效率很低.如果你直接写入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();
正如上面的答案中所提到的,这里最大的问题是Encoding
,由于未指明而被拖欠.
如果未指定Encoding
此类转换,UTF-8
则使用默认值- 可能与您的方案匹配也可能不匹配.您也可以通过将数据推入a 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();