Excel 在讀取 csv 的時候是通過讀取文件頭上的 bom 來識別編碼的,這導(dǎo)致如果我們生成 csv 文件的平臺輸出無 bom 頭編碼的 csv 文件(例如 utf-8 ,在標(biāo)準(zhǔn)中默認(rèn)是可以沒有 bom 頭的),Excel 只能自動按照默認(rèn)編碼讀取,不一致就會出現(xiàn)亂碼問題了。
掌握了這點相信亂碼已經(jīng)無法阻擋我們前進(jìn)的步伐了:只需將不帶 bom 頭編碼的 csv 文件,用文本編輯器(工具隨意,推薦 notepad++ )打開并轉(zhuǎn)換為帶 bom 的編碼形式(具體編碼方式隨意),問題解決。
當(dāng)然,如果你是像我一樣的碼農(nóng)哥哥,在生成 csv 文件的時候?qū)懭?bom 頭更直接點,用戶會感謝你的。
附錄:對于 utf-8 編碼,unicode 標(biāo)準(zhǔn)中是沒有 bom 定義的,微軟在自己的 utf-8 格式的文本文件之前加上了EF BB BF三個字節(jié)作為識別此編碼的 bom 頭,這也解釋了為啥大部分亂碼都是 utf-8 編碼導(dǎo)致的原因
SPRING BATCH中生成CSV文件時的解決方案:
new FlatFileItemWriterBuilder<T>()
.name(itemWriterName)
.resource(outputResource)
.lineAggregator(lineAggregator)
.headerCallback(
h -> {
System.out.println(header);
h.write('\uFEFF');//只需加這一行
h.write(header);
}
)
.build();
https://stackoverflow.com/questions/48952319/send-csv-file-encoded-in-utf-8-with-bom-in-java