如何防止excel保存后更改csv文件编码? [复制]

Posted

技术标签:

【中文标题】如何防止excel保存后更改csv文件编码? [复制]【英文标题】:How to prevent excel from changing csv file encoding after save? [duplicate] 【发布时间】:2016-03-20 00:40:46 【问题描述】:

我正在尝试将简单的数据从 .csv 文件导入到我的 MVC 应用程序。

为了消除用户在他的计算机中保存 .csv 文件模板的需要,并避免首先遇到获取它的麻烦,我在我的表单上创建了一个生成模板的按钮。

我在编写器类中从我的模型对象生成一个字符串:

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

根据How to GetBytes() in C# with UTF8 encoding with BOM?

我强制 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 无法识别模板中的特殊字符。

【问题讨论】:

这个问题与 C# 和 asp.net MVC 都没有任何关系。 我不同意这是一个重复的问题。我仍然相信必须有一种方法可以强制 excel 不更改编码,因为当它设置为没有 BOM 的 UTF-8 时它不会更改它。如果我找不到这样做的方法,我可能会采用 Chriss 在答案评论中建议的方式,并验证用户导入文件的编码,或者离开 csv 完整并只使用 excel 它自己。如果发生这种情况,我会接受这个问题是重复的。 【参考方案1】:

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

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

需要让用户在记事本中打开文件并以正确的格式保存(工作量很大!)或制定一些检测/转换逻辑。

【讨论】:

是的,我想了这么多,但仍然没有解释为什么 excel 不改变没有 BOM 的 UTF-8 编码的 csv 文件的编码。 一般的经验法则总是假设最终用户绝对会破坏你给他们的任何东西。如果您打算允许将用户手中的某些内容上传回您的站点,那么您应该采取所有必要的步骤来确保其编码正确、格式正确等。将此责任转移到客户端永远不会一个解决方案。 我在这里找到了很多从不同应用程序将 CSV 保存为 UTF-8 的选项。 help.surveygizmo.com/help/…

以上是关于如何防止excel保存后更改csv文件编码? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

怎么设置excel打开csv文件时候的默认编码?

excel打开csv 出现乱码怎么解决

如何创建csv文件

excel打开csv 出现乱码怎么解决

excel2007打开导出的.csv文件出现中文乱码,求高手指点

如何使用openoffice打开excel文件并保存为csv