hen*_*gst 17 .net c# xml encoding iso-8859-1
我在使用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
Run Code Online (Sandbox Code Playgroud)
然后我像这样添加我的挪威文字:
xmlTextWriter.WriteCData(myNorwegianText);
Run Code Online (Sandbox Code Playgroud)
然后我将文件写入磁盘,如下所示:
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();
Run Code Online (Sandbox Code Playgroud)
现在的问题是,在这个文件中,所有的挪威字符看起来都很有趣.
我可能会以某种愚蠢的方式做上述事情.有关如何解决它的任何建议?
tom*_*asr 13
为什么要先将XML写入MemoryStream,然后将其写入实际的文件流?那效率很低.如果你直接写入FileStream它应该工作.
如果你仍然想做双写,无论出于何种原因,做两件事之一.或
确保您使用的StreamReader和StreamWriter对象都使用与XmlWriter 使用的编码相同的编码(不仅仅是StreamWriter,就像其他人建议的那样),或者
不要使用StreamReader/StreamWriter.而是使用简单的byte []和Stream.Read/Write在字节级复制流.无论如何,这将是更高效的.
Jon*_*eet 13
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();
Run Code Online (Sandbox Code Playgroud)
正如上面的答案中所提到的,这里最大的问题是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();
Run Code Online (Sandbox Code Playgroud)