检测文件是否为ISO-8859-1 / Unicode(或非ASCII)

时间:2013-12-16 17:57:10

标签: c# csv unicode

我的asp.net应用程序中有一个输入文件。 用户提交CSV文件以更新数据库。

此CSV文件是通过导出.xlsx创建的 此.xlsx文件包含非ascii字符,例如França,Rússia等。
用户有时会通过“CSV(MS-DOS)”(写入ASCII格式)而不是“CSV(逗号分隔文件)”(保留.xlsx编码)错误地保存它。

因此,要在将数据写入数据库之前验证文件编码....

如何安全检测.net中提交的文件的文件编码?

ps:BOM验证还不够。文件可以是带有BOM的UTF。

1 个答案:

答案 0 :(得分:4)

  

如何安全地检测.net中提交的文件的文件编码?

你不能。

Excel的“CSV”保存在机器的ANSI代码页中出现,“CSV(MS-DOS)”出现在OEM代码页中。这两种编码因机器而异,它们从来没有像UTF-8或UTF-16那样有用。 (实际上,在某些东亚机器上,它们甚至可能不完全兼容ASCII。)

您可以根据启发式进行猜测。例如,如果França是您处理的文档中的常见值,则可以检测其常见编码:

                                                    F  r  a  n  ç  a
Code page 1252 (ANSI on Western European machines): 46 72 61 6e e7 61
Code page 850  (OEM  on Western European Machines): 46 72 61 6e 87 61

如果你没有这样的常规模式,你可以做的最好是任意猜测(见this question)。无论哪种方式,它都很难被称为“安全”。

CSV作为格式没有声明编码的机制,并且没有仅仅使用UTF-8的事实上的标准。因此,它无法真正用作传输具有任何可靠性的非ASCII文本的机制。

您可以看到的另一种方法是鼓励用户将Excel保存为“Unicode文本”。这将为您提供UTF-16LE编码的.txt文件(.NET术语中为Encoding.Unicode),您可以从BOM中轻松检测到该文件。内容是TSV,因此引用规则与CSV相同,但带有制表符分隔符。