C# 如何确定上传的文件是UTF-8还是UTF-16?

C# 如何确定上传的文件是UTF-8还是UTF-16?,c#,asp.net,encoding,C#,Asp.net,Encoding,我有一个网站,用户可以上传一个txt文件的数据和数据将被导入数据库。但是,一些用户正在UTF-8中上载数据,其他用户正在UTF-16中上载数据 byte[] fileData = null; uploader.PostedFile.InputStream.Read(fileData, 0, length); data = TLCommon.EncodeJsString(System.Text.Encoding.UTF8.GetString(fileData)); 当文件

我有一个网站,用户可以上传一个txt文件的数据和数据将被导入数据库。但是,一些用户正在UTF-8中上载数据,其他用户正在UTF-16中上载数据

    byte[] fileData = null;
    uploader.PostedFile.InputStream.Read(fileData, 0, length);
    data = TLCommon.EncodeJsString(System.Text.Encoding.UTF8.GetString(fileData));

当文件以UTF-16格式保存并上载时,数据是垃圾。如何处理这种情况?

您可以使用各种启发式方法,例如检查流中
00
字节的高百分比。(这些在UTF-8中不存在,但在包含ASCII字符的UTF-16文本中很常见。)

然而,这无法区分UTF-8和Windows-1252,它们是不兼容的8位编码,在美国英语Windows系统中非常常见。您可以添加更多检查,例如查找在一种编码中无效但在另一种编码中无效的字节序列,但这开始变得非常复杂,并且通常无法区分不同的单字节编码


Microsoft提供了一个名为的库,它可以通过对流中字节的统计分析自动检测UTF-8、UTF-16和许多8位代码页。如果它有足够大的文本样本,那么它的准确性是相当好的。I,并发布了。

您可以使用以下几个选项:检查内容类型,查看其是否包含指示编码的字符集参数(例如
内容类型:text/plain;字符集=utf-16
);检查上传的数据是否有BOM表(文件中的前几个字节将映射到unicode字符U+FEFF-2字节(UTF-16),3字节(UTF-8),或者您是否了解该文件(第一个字符应该是ascii,比如在XML中,它以“所以更好的选择是只告诉他们以utf-8上传?”Shawn你可以,但我认为“仅以utf-8上传”对大多数非技术用户来说是不可理解的,对技术用户来说是令人沮丧的。字节顺序标记是
U+FEFF
(在UTF16-LE中为
FF FE
,或在UTF-16BE中为
FE FF
U+FFFE
不是Unicode中的字符。