如何防止Excel保存后更改csv文件的编码?

我试图从.csv文件实现一个简单的数据导入到我的MVC应用程序。

为了消除用户在他的计算机上保存.csv文件模板的需要,并且经历了首先得到它的麻烦,我在我的表单上创build了一个生成模板的button。

我从一个作家类的模型对象生成一个string:

this.Writer.GetCswTemplate()从viewModel返回string( 即column1; colum2 \ r \ n

按照如何在C#中使用带有BOM的UTF8编码的GetBytes()?

强制excel打开UTF-8编码的.csv文件:

 var templateResult = Encoding.UTF8.GetBytes(this.Writer.GetCswTemplate()); var preamble = Encoding.UTF8.GetPreamble(); var templateBytes = preamble.Concat(templateResult).ToArray(); 

将生成的模板发送给用户我使用MVC File()助手:

 return this.File(templateBytes, "application/csv", "filename.csv"); 

它工作的很好,它生成模板,将其返回给用户,用Excel打开并显示所有特殊字符。 如果我在Notepad ++中打开生成的文件,我可以看到它的编码是UTF-8。

用户填写生成的模板并将其保存在Excel中时,会发生此问题。 出于某种原因,Excel决定将文件编码更改为ANSI。

有什么办法可以阻止我吗? 我错过了什么(添加某种标题或什么)?

有趣的是,如果我生成模板与UTF-8(没有BOM),修改所述文件在Excel中并保存它,Excel不会更改其编码为ANSI。 问题在于Excel无法识别模板内的特殊字符。

UTF-8是一个可以包含任何Unicode字符的编码集。 不幸的是,并不是所有的应用程序默认都能用UTF-8编码文件,Microsoft Excel就是其中之一。

Excel使用ANSI编码CSV文件,而不是Unicode

一个人可能要求用户在记事本中打开文件,并保存在正确的格式(要做很多工作!)或制定一些检测/转换逻辑。