Excel開啟CSV檔案亂碼的問題

2021-09-02 16:45:30 字數 1733 閱讀 6020

系統管理功能中,很多時候需要匯入匯出資料,基本上採用的也都是csv檔案的形式(excel讀入還是比較麻煩)。由於字符集的問題,大部分都採用utf-8編碼。

csv檔案的預設開啟方式是excel,但雙擊utf-8編碼的csv檔案時,excel是不能正常顯示資料的,會亂碼。這是做管理頁面乙個很常見的問題。

原因:excel本身是對應了utf-8編碼的,但當csv檔案是utf-8編碼時,原封不動的雙擊開啟csv檔案時,excel是無法識別為utf-8的,而是按照系統預設字元ansi(簡體中文gb2312、日文shift_jis)來處理的就亂碼了。所以根本原因是excel字符集識別的問題。

[img]

[img]

三種方法:

(1)把csv檔案的編碼變換為系統字符集(utf-8 -> gb2312/shift_jis)

這是最簡單的方法。大部分文字編輯器都有「另存為」功能,儲存時選擇字符集。

問題:編碼變換後,會有一些特殊字元無法支援。

(2)通過excel讀入外部資料

不需要改變編碼,啟動excel,資料->自文字,選擇 csv 檔案。

出現文字匯入嚮導,選擇 65001 : unicode (utf-8)、分隔符號選擇逗號後匯入資料即可。但每次匯入比較麻煩。

問題:不支援換行的資料。

(3)採用utf-8帶bom的編碼

上邊兩種方法都不是根本的解決方法,都需要使用者自己處理csv檔案,所以根本問題還是如何讓excel識別utf-8編碼。

方法是通過新增bom可以使excel識別檔案為utf-8編碼。

bom:byte-order mark

帶bom的檔案會比不帶bom的檔案多出3個位元組,這三個位元組是固定的:0xef 0xbb 0xbf,其unicode為\ufeff。

[img]

[img]

fileoutputstream fos = new fileoutputstream("d:\\test1.csv");  

fos.write( 0xef );

fos.write( 0xbb );

fos.write( 0xbf );

bufferedwriter bw = new bufferedwriter( new outputstreamwriter( fos, "utf8" ));

bw.write("a,b,c,d\r\n");

bw.close();

fos.close();

[img]

也可以通過65279實現。

fileoutputstream fos = new fileoutputstream("d:\\test2.csv");

printwriter pw = new printwriter(new outputstreamwriter(fos, "utf8"), true);

pw.print((char)65279);

pw.print("e,f,g,h\r\n");

pw.flush();

pw.close();

fos.close();

[img]

這種方法能夠避免變換編碼引起的特殊字元不支援,也不需要很麻煩的匯入資料,也可以對應改行資料。當然通過大部分文字編輯器也可以為utf-8檔案新增bom。

問題:處理csv檔案是要特殊處理檔案的前三個位元組。

linux不支援bom

excel 2007需要安裝sp3才支援

csv 檔案用Excel開啟亂碼

最近在做乙個上傳的功能,記錄下自己的感受。剛開始我用的是excel上傳 但是發現客戶伺服器有用64位的,使用的時候程式會報錯 未在本地計算機上註冊 microsoft.jet.oledb.4.0 提供程式經查閱資料,發現是excel對64位的相容性很差 64位作業系統不支援microsoft ole...

匯出CSV格式檔案,用Excel開啟亂碼的解決辦法

匯出csv格式檔案,用excel開啟亂碼的解決辦法 1 治標不治本的辦法 將匯出csv資料檔案用記事本開啟,然後另存為 ansi 編碼格式,再用excel開啟,亂碼解決。但是,這個辦法對於軟體開發來說,就是不具有友好性,治標不治本 2 利用相容微軟,指定bom的辦法 servletoutputstr...

寫csv解決Excel開啟亂碼問題

寫csv解決以文字和excel開啟亂碼問題 public static file createcsvfile list exportdata,linkedhashmap map,string outputpath,string filename 定義檔名格式並建立 csvfile new file ...