【问题标题】:Javascript export CSV encoding utf-8 issueJavascript 导出 CSV 编码 utf-8 问题
【发布时间】:2017-07-16 17:01:44
【问题描述】:

我需要将 javascript 数组导出到 CSV 文件并下载。我做到了,但 'ı,ü,ö,ğ,ş' 这个字符在 CSV 文件中看起来像 'ı ü ö ÄŸ ÅŸ'。我尝试了许多在此网站上推荐的解决方案,但对我没有用。

我添加了我的代码sn-p,谁能解决这个问题?

var csvString = 'ı,ü,ö,ğ,ş';

var a = window.document.createElement('a');
a.setAttribute('href', 'data:text/csv; charset=utf-8,' + encodeURIComponent(csvString));
a.setAttribute('download', 'example.csv');
a.click();

【问题讨论】:

  • 您可能知道此解决方案不适用于Internet Explorer,因为此浏览器不支持以这种方式使用data-URI。但至少你应该使用Firefox 让它工作。 Firefox 将不接受未附加到 DOM 的元素的 click 事件。因此,您需要将 A 元素附加到 DOM 而不仅仅是创建它。请参阅我的答案中的示例。但也请阅读我的结论。以这种方式使用CSV 不是解决方案,而是许多问题的一部分。

标签: javascript excel csv encoding utf-8


【解决方案1】:

这取决于打开example.csv 文件的程序。使用文本编辑器,编码将是UTF-8,并且字符格式不会错误。但是使用ExcelCSV 的默认编码是ANSI,而不是UTF-8。因此,如果不强制Excel 使用不是ANSI 而是UTF-8 作为编码,字符将是错误的。

Excel 可以使用UTF-8 强制CSVBOM (Byte Order Mark) 作为文件中的第一个字符。 UTF-8 的默认 BOM 是字节序列 0xEF,0xBB,0xBF。所以人们可以认为简单地将"\xEF\xBB\xBF" 作为字符串的第一个字节将是解决方案。但这肯定太简单了,不是吗? ;-) 这个问题是如何强制 JavaScript 不将这些字节作为字符。 “解决方案”是使用 "\uFEFF" 中提到的“通用 BOM”Special Characters (JavaScript)

例子:

var csvString = 'ı,ü,ü,ğ,ş,#Hashtag,ä,ö';
var universalBOM = "\uFEFF";
var a = window.document.createElement('a');
a.setAttribute('href', 'data:text/csv; charset=utf-8,' + encodeURIComponent(universalBOM+csvString));
a.setAttribute('download', 'example.csv');
window.document.body.appendChild(a);
a.click();

另见Adding UTF-8 BOM to string/Blob

使用它,编码将是正确的。但是,只有在 Windows 语言环境设置中的默认列表分隔符是逗号时,这才能正常工作。如果不是,例如,如果分号是Windows 语言环境设置中的默认列表分隔符,那么所有内容都将位于第一列,而不用逗号分隔。然后你还必须在CSV 中使用分号作为分隔符。但这是另一个问题,导致结论完全不使用CSV,而是使用可以直接创建Excel文件的库(*.xls*.xlsx)。

【讨论】:

  • 我使用 WPS Office 电子表格 打开 CSV 文件,但该程序仍然无法正确显示字符。我尝试使用 Microsoft Office Excel 打开 CSV 文件并正常工作。所以我明白了我的问题。感谢您的帮助。
  • 这很适合让 Excel 使用 UTF-8 编码打开文件,但是当我点击保存 (Ctrl+S) 时,它会将其保存为 TSV 文本文件而不是 CSV utf-8文件。你有没有遇到过这个问题?
  • @Dylan:是的,但这是另一个问题,它是 Excel 应用程序中的一个 Microsoft 错误,它无法保存 CSV UTF-8 编码。另请参阅我回答中的最后一句话。
  • @AxelRichter - 我在自己的项目中使用了您的解决方案,但我导出的数据是 Instagram 标题,其中包括主题标签 (#) - 您提供的 UTF-8 BOM 解决方案是现在一旦碰到第一个 # 字符就切断字符串 - 有什么建议可以让 BOM 忽略 # 吗?谢谢!
  • @tristanojbacon:抱歉,无法复制。即使# 字符在数据中也对我有用。
猜你喜欢
  • 2015-11-04
  • 2019-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-01
  • 1970-01-01
相关资源
最近更新 更多