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

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

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

问题是,

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

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

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

如果您知道该文件是使用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表现良好。