我在ASP.NET网页中有一个FileUpload
控件,用于上传文件,其中的内容(在流中)在C#代码后面处理并在页面上输出之后,使用HtmlEncode
。
但是,其中一些输出正在变得严重,特别是符号'£'作为Unicode FFFD REPLACEMENT CHARACTER输出。我已将其跟踪到输入文件,即Windows 1252('ANSI')编码。
问题是,
如何确定文件是编码为1252还是UTF8?它可以是,和
如果它在Windows 1252中,如何将其转换为UTF8,保留符号£等?
我看过网上但找不到满意的答案。
答案 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做得很好。