C#用问号替换特殊字符

问题描述 投票:0回答:1

我在c#中遇到编码问题

我正在下载一个在windows-1250中编码的xml文件,然后,当保存到文件中时,Š和Đ等特殊字符会替换为?即使使用windows-1250编码正确保存文件。

这是我的代码示例(简化):

var res = Encoding.GetEncoding("Windows-1250").GetBytes(client.DownloadString("http://link/file.xml"));
var result = Encoding.GetEncoding("Windows-1250").GetString(res);
File.AppendAllText("file.xml", result);

事实上xml文件是使用windows-1250编码的,当我使用浏览器下载它时,它读起来很好。

有谁知道这里发生了什么?

c# unicode encoding webclient
1个回答
0
投票

问题可能来自两个不同的来源,一个位于代码段的开头,一个位于代码段的末尾。正如已经指出的那样,你在代码中进行的编码和解码实际上是无用的,因为原点(DownloadString返回的内容)和目标(变量result)都是C#Unicode字符串。

来源1:DownloadString

DownloadString无法正确解码Windows-1250编码的字符串,因为服务器没有在Content-Type头中发送正确的字符集,或者DownloadString甚至不支持这个(不太可能,但我不熟悉DownloadString)。

来源2:File.AppendAllText

字符串被正确下载,然后在内存中编码到Windows-1250,然后再次解码为Unicode字符串,一切运行良好。但后来它被File.AppendAllText用另一种默认编码编写。 AppendAllText有一个可选的第三个参数,可用于指定编码。您应该将其设置为Windows-1250以实际编写Windows-1250编码的文件。

此外,请确保您用于打开文件的编辑器使用相同的编码 - 这通常不容易保证,因此我建议您在“开发人员友好”编辑器中打开它,以便在指定编码时打开文本文件。 (Vim,Emacs,Notepad ++,Visual Studio,...)。

© www.soinside.com 2019 - 2024. All rights reserved.