如何将可能的Windows 1252'ANSI'编码上传文件转换为.NET中的UTF8?

时间:2009-01-22 16:34:15

标签: c# asp.net vb.net unicode

我在ASP.NET网页中有一个FileUpload控件,用于上传文件,其中的内容(在流中)在C#代码后面处理并在页面上输出之后,使用HtmlEncode

但是,其中一些输出正在变得严重,特别是符号'£'作为Unicode FFFD REPLACEMENT CHARACTER输出。我已将其跟踪到输入文件,即Windows 1252('ANSI')编码。

问题是,

  1. 如何确定文件是编码为1252还是UTF8?它可以是,和

  2. 如果它在Windows 1252中,如何将其转换为UTF8,保留符号£等?

  3. 我看过网上但找不到满意的答案。

1 个答案:

答案 0 :(得分:8)

如果您知道该文件是使用Windows 1252编码的,则可以使用StreamReader打开该文件并传递正确的编码。那就是:

StreamReader reader = new StreamReader("filename", Encoding.GetEncoding("Windows-1252"), true);

“true”告诉它根据文件前面的字节顺序标记设置编码,如果它们在那里的话。否则,它将以Windows-1252打开。

然后您可以读取该文件,如果您想转换为UTF-8,请写入您使用该结束编码打开的文件。

对第一个问题的简短回答是,确定文件编码的方式并不是100%令人满意。如果存在字节顺序标记,您可以确定它的Unicode风格,但是如果没有BOM,您将无法使用启发式方法来确定编码。

我对启发式方法没有很好的参考。您可以搜索“记事本如何确定字符集”。我记得前一段时间看到了一些事情。

在实践中,我发现以下内容适合我的大部分工作:

StreamReader reader = new StreamReader("filename", Encoding.Default, true);

我读过的大多数文件都是我用.NET的StreamWriter创建的文件,它们是带有BOM的UTF-8。我得到的其他文件通常是用一些不懂Unicode或代码页的工具编写的,我只是把它当作一个字节流来处理,而Encoding.Default做得很好。