2017-02-25 130 views
2

我需要將JavaScript數組導出到CSV文件並下載它。我做到了,但是'ı,ü,ö,»,這個字符看上去像是'ÃÃÃÃÃÃÄÄŸÅŸ'在CSV文件中。我已經嘗試了許多在本網站上推薦的解決方案,但沒有爲我工作。Javascript導出CSV編碼UTF-8問題

我加了我的代碼片段,任何人都可以解決這個問題嗎?

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();

+0

您可能知道該解決方案在「Internet Explorer」中不起作用,因爲此瀏覽器不支持以這種方式使用「data」-URI。但至少你應該使用'Firefox'工作。 'Firefox'不會接受沒有附加到DOM的元素的'click'事件。所以你需要將你的'A'元素附加到DOM,而不僅僅是創建它。看我的答案中的例子。但也讀了我的結論。這種方式使用'CSV'不是解決方案,而是許多問題的一部分。 –

回答

1

這取決於什麼程序打開example.csv文件。使用文本編輯器,編碼將爲UTF-8,字符不會變形。但是使用ExcelCSV的默認編碼是ANSI而不是UTF-8。因此,在不強迫Excel使用不是ANSI而是使用UTF-8作爲編碼的情況下,字符將會格式錯誤。

Excel可使用UTF-8被迫爲CSV與把一個BOMByte 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)的庫。

+0

我使用** WPS Office Spreadsheet **打開CSV文件,但該程序仍然沒有正確顯示字符。我試圖用** Microsoft Office Excel **打開CSV文件並正常工作。所以我明白我的問題。感謝幫助。 –

+0

這適用於讓Excel以UTF-8編碼打開文件,但當我點擊保存(Ctrl + S)時,它將其另存爲TSV文本文件,而不是CSV utf-8文件。你有沒有遇到過這個問題? – Dylan

+1

@Dylan:是的,但這是另一個問題,它是Excel應用程序中的一個Microsoft錯誤,它無法保存CSV UTF-8編碼。另請參閱我答案中的最後一句。 –