在做專案時碰到使用外語的情況下,我們就會使用utf-8編碼。但是,在用php匯出csv檔案時,如果寫入的資料是使用utf-8編碼的日語、韓語之類的外文,就會出現亂碼。
要解決php生成csv檔案的亂碼問題,只需要在檔案的開始輸出bom頭,告訴windows csv檔案的編碼方式,從而讓excel開啟csv時採用正確的編碼。
什麼是bom在所有內容輸出之前在ucs 編碼中有乙個叫做」zero width no-break space」的字元,它的編碼是feff。而fffe在ucs中是不存在的字元,所以不應該出現在實際傳輸中。ucs規範建議我們在傳輸位元組流前,先傳輸字元」zero width no-break space」。這樣如果接收者收到feff,就表明這個位元組流是big-endian的;如果收到fffe,就表明這個位元組流是little-endian的。因此
字元」zero width no-break space」又被稱作bom。utf-8不需要bom來表明位元組順序,但可以用bom來表明編碼方式。字元」zero width no-break space」的utf-8編碼是ef bb bf。所以如果接收者收到以ef bb bf開頭的位元組流,就知道這是utf-8編碼了。windows就是使用bom來標記文字檔案的編碼方式的
print(chr(0xef).chr(0xbb).chr(0xbf));
幾個utf編碼的bom頭
define ('utf32_big_endian_bom' , chr(0x00) . chr(0x00) . chr(0xfe) . chr(0xff));完整的**define ('utf32_little_endian_bom', chr(0xff) . chr(0xfe) . chr(0x00) . chr(0x00));
define ('utf16_big_endian_bom' , chr(0xfe) . chr(0xff));
define ('utf16_little_endian_bom', chr(0xff) . chr(0xfe));
define ('utf8_bom' , chr(0xef) . chr(0xbb) . chr(0xbf));
1header('expires: 0');
2header('cache-control: private');
3header('cache-control: must-revalidate, post-check=0, pre-check=0');
4header('content-description: file transfer');
5header('content-encoding: utf-8');
6header('content-type: text/csv; charset=utf-8');
7header('content-disposition: attachment; filename=customers_export.csv');89
echo "\xef\xbb\xbf"; //
utf-8 bom
10// print(chr(0xef).chr(0xbb).chr(0xbf));
11
php匯出csv檔案無亂碼示例
ini set error reporting e all ini set display startup errors 1 ini set display errors 1 function escapecsv str return str function iconvstr str intent...
匯出csv檔案有亂碼
專案中生成csv檔案,裡面出現中文亂碼問題,後來加了一行out.write 0xfeff 後問題就解決了。res.setheader content disposition attachment filename name csv out.write 0xfeff out.write sb 這裡有乙...
PHP 匯出csv檔案亂碼解決方案
我們經常匯出csv檔案都喜歡直接用file put contents file name file 這種方式直接匯出,如果沒有中文字元還好,要是有中文字元的話就會出現亂碼的情況,讓人很是頭疼,下面是亂碼解決方案 str 匯出的含有中文字元的內容 fp fopen export.csv a 在寫入資料...