我有一个网站,用户可以上传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保存并上传时,数据是垃圾。我该如何处理这种情况?
答案 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中,以'<'开头)然后你可以用它来找出编码。但是,如果你没有这些信息,你必须使用一些启发式方法来猜测。