這取決於什麼程序打開example.csv
文件。使用文本編輯器,編碼將爲UTF-8
,字符不會變形。但是使用Excel
,CSV
的默認編碼是ANSI
而不是UTF-8
。因此,在不強迫Excel
使用不是ANSI
而是使用UTF-8
作爲編碼的情況下,字符將會格式錯誤。
Excel
可使用UTF-8
被迫爲CSV
與把一個BOM
(Byte Order Mark)作爲文件在第一字符。 UTF-8
的默認BOM
是字節序列0xEF,0xBB,0xBF
。所以人們可能會認爲簡單地將"\xEF\xBB\xBF"
作爲字符串的第一個字節將是解決方案。但肯定這太簡單了,不是嗎? ;-)這個問題是如何強制JavaScript不把這些字節當作字符。 「解決方案」使用Special Characters (JavaScript)中提到的「通用BOM」"\uFEFF"
。
實施例:
var csvString = 'ı,ü,ü,ğ,ş';
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
)的庫。
您可能知道該解決方案在「Internet Explorer」中不起作用,因爲此瀏覽器不支持以這種方式使用「data」-URI。但至少你應該使用'Firefox'工作。 'Firefox'不會接受沒有附加到DOM的元素的'click'事件。所以你需要將你的'A'元素附加到DOM,而不僅僅是創建它。看我的答案中的例子。但也讀了我的結論。這種方式使用'CSV'不是解決方案,而是許多問題的一部分。 –