|
|
|
|
|
今天用C#創(chuàng)建一個CSV文件,過程很順利,創(chuàng)建的文件用記事本能正常打開且內(nèi)容沒有問題,可是,用Excel打開時卻在開頭出現(xiàn)幾個字符的亂碼,這是怎么回事?
經(jīng)驗告訴我,內(nèi)容出現(xiàn)亂碼基本可斷定是內(nèi)容編碼有問題,但是如何解決這個編碼問題,讓它能在各個編輯器或瀏覽器打開正常呢?
再研究研究。
發(fā)現(xiàn)這個CSV文件用記事本打開,再保存后,也能用Excel正常打開沒有亂碼。這是什么原因呢?
這就要看看記事本保存的utf-8與我程序創(chuàng)建時用的utf-8有什么不同了。
經(jīng)過查閱相關(guān)資料,發(fā)現(xiàn),記事本保存的utf-8文件,實際上會在文件開始的地方插入UTF-8 BOM頭,是UTF-8 BOM編碼的文件,這就涉及到加BOM不加BOM的不同了。
UTF-8編碼的文件中,BOM占三個字節(jié)。如果用記事本把一個文本文件另存為UTF-8編碼方式的話,用UE打開這個文件,切換到十六進制編輯狀態(tài)就可以看到開頭的FFFE了。
看下圖。
這是個標識UTF-8編碼文件的好辦法,軟件通過BOM來識別這個文件是否是UTF-8編碼,很多軟件還要求讀入的文件必須帶BOM(Excel就是其中之一)。
知道了問題所在,解決的方法就自然有了。
下面是C#代碼:
UTF-8編碼的字符串開頭處的三個bytes 0xef,0xbb,0xbf就稱為UTF-8 BOM頭。
C#中通過
StreamWriter sw = new StreamWriter(path, true);
sw.WriteLine(Content);
這樣的代碼寫入TXT中的數(shù)據(jù)默認的編碼是GB2312格式,那么如何才能使用utf-8的編碼格式寫入TXT呢?
代碼如下:
UTF8Encoding utf8 = new UTF8Encoding(false);
StreamWriter sw = new StreamWriter(path, true, utf8);
這樣確實使用utf-8的編碼寫入沒錯,但是卻不是BOM的編碼模式,那如何才能使用utf-8 BOM編碼格式呢?
其實很簡單,代碼如下:
UTF8Encoding utf8BOM = new UTF8Encoding(true);
StreamWriter sw = new StreamWriter(path, true, utf8BOM);
有些情況,我們要保存無BOM的utf8格式,用C#可以這樣來實現(xiàn)。
用C#的 File.WriteAllLines 方法,保存文件為無BOM的utf8格式:
File.WriteAllText(strLuaFilePath, string.Join("\n", fileContentList.ToArray()), new System.Text.UTF8Encoding(false));
本文介紹了C#創(chuàng)建的CSV文件Excel打開有亂碼的原因及解決方法,通過本文的介紹,我們可以知道文件保存的編碼,UTF-8與UTF-8 BOM的不同,當以后再遇到文件編碼問題時,又多了一份經(jīng)驗。