相信很多人在使用php的過程中都遇到過生成檔案亂碼的情況,不論是使用fwrite
還是file_put_contents
寫入。
可能你會先嘗試從編碼入手嘗試解決,但最終的結果往往是不理想的,儘管我們都將其轉換為了utf-8
編碼了...
那麼究其根本原因是什麼呢?
一句話:缺少頭部bom(當然,這裡指的肯定不是js的bom)
既然提到了bom,那麼可能有的同學不太了解這個傢伙,這裡我簡單說一下,老鳥可以跳過。
在windows
下用記事本之類的程式將文字檔案儲存為utf-8
格式時,記事本會在檔案頭前面加上幾個不可見的字元(ef bb bf
),就是所謂的bom(byte order mark)
。
不僅限於 記事本儲存的檔案,只要在檔案的開口包含了「ef bb bf」
幾個不可見的字元(十六進製制應該是是xefxbbxbf
,用二進位制編輯檔案可見)。這像是乙個約定俗成的東西,當系統看到這玩意的時候,就會覺得你這個檔案是utf-8
編碼的。
這就是為什麼當檔案沒有bom時,你給使用者呈現的檔案就可能是亂碼的原因了。
ps : 其實你可以將bom理解成html中的charset屬性和xml中的encoding屬性,就是起乙個標識作用。
那麼如何在php
中輸出bom
呢?
答案是在所有內容輸出之前輸出:
print(chr(0xef).chr(0xbb).chr(0xbf));
當然,如果你是在生成檔案,可能是下面兩種:
fwrite($file, chr(0xef).chr(0xbb).chr(0xbf));
file_put_contents($file, chr(0xef).chr(0xbb).chr(0xbf));
PHP寫入txt檔案
myfiletoread fopen txt readme.txt r or die unable to open file myfileread fread myfiletoread,20 myfiletowrite fopen txt writeme.txt a or die unable to...
PHP生成TXT檔案 php讀取txt檔案內容
filename filename.txt header content disposition attachment filename filename 輸出內容 直接用echo輸出,r n 用以換行。第一步 處理中文檔名 filename 中文檔名.txt encoded filename ur...
CsvHelper, 幫助讀取和寫入CSV檔案的庫
csvhelper 用於讀取和寫入csv檔案的庫。非常快速,靈活且易於使用。支援讀取和寫入自定義類物件。要安裝 csvhelper,在包管理器控制台中執行以下命令 pm install package csvhelper 雙重許可 microsoft public 許可證 ms pl apache許...