C#用问号替换特殊字符

时间:2019-02-28 15:02:42

标签: c# unicode encoding webclient

我在c#中编码时遇到了问题

我正在下载一个Windows-1250编码的xml文件,然后将其保存到文件中时,将Š和special等特殊字符替换为?。即使使用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编码的,当我使用浏览器下载该文件时,它的读取效果就很好。

有人知道这是怎么回事吗?

1 个答案:

答案 0 :(得分: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等)。