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

时间:2011-06-23 19:45:14

标签: 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));

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

2 个答案:

答案 0 :(得分:2)

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

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

Microsoft提供了一个名为MLang的库,它可以使用流中字节的统计分析自动检测UTF-8,UTF-16和许多8位代码页。如果它具有足够大的文本样本,则其准确性非常好。我blogged about how to use this method,发布了full source code on GitHub

答案 1 :(得分:0)

您可以使用几个选项:检查内容类型以查看它是否包含指示编码的charset参数(例如Content-Type: text/plain; charset=utf-16);检查上传的数据是否有BOM(文件中的前几个字节,它将映射到unicode字符U + FEFF - UTF-16为2个字节,UTF-8为3个字节),或者如果您对文件有所了解(是第一个应该是ascii的字符,例如在XML中,以'<'开头)然后你可以用它来找出编码。但是,如果你没有这些信息,你必须使用一些启发式方法来猜测。