php UTF8 文件的簽名問題
更新時間:2009年10月30日 21:54:26 作者:
在我們保存UTF8文本文件的時候,可以選擇帶簽名,或者不帶簽名。
也就是 有BOM 格式編碼,或者 無BOM格式編碼。
如果看文件的內(nèi)容,是看不出任何差別的,以下列文件(schema.sqlite.sql)內(nèi)容為例:
schema.sqlite.sql
CREATE TABLE guestbook (
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
email VARCHAR(32) NOT NULL DEFAULT 'noemail@test.com',
comment TEXT NULL,
created DATETIME NOT NULL
);
CREATE INDEX "id" ON "guestbook" ("id");
如果不帶簽名,則文件的大小為232字節(jié),如果帶簽名,則文件大小為235字節(jié)。
UTF8簽名有3個字節(jié)(內(nèi)容為:EFBBBF),是專門用來告訴軟件:該文件是UTF8編碼的。
在一般情況下,有無簽名不會帶來問題,因為編輯器或者其他軟件可以按照文本的內(nèi)容來推斷出是否是UTF8。
但有些時候還是會導(dǎo)致問題,比如上訴文件。該文件是sql語句文件,程序恰好要通過以下語句(php)來執(zhí)行該sql:
$schemaSql = file_get_contents(dirname(__FILE__) . '/schema.sqlite.sql');
$dbAdapter->getConnection()->exec($schemaSql);
在這種情況下,帶有簽名的文件就會導(dǎo)致問題了,因為“UTF8簽名用的三個字節(jié)”其實是位于文件的最前面。所以導(dǎo)致了上面的語句無法成功運行。
解決的辦法也很簡單,去掉該文件UTF8簽名即可。
當(dāng)然,上面文件的內(nèi)容其實都是單字節(jié)的,是沒有必要保存為UTF8編碼的。
補充:全部是單字節(jié)內(nèi)容的文件除非加了UTF8簽名,不然再次打開文件時,還是系統(tǒng)的默認(rèn)編碼而已。
如果看文件的內(nèi)容,是看不出任何差別的,以下列文件(schema.sqlite.sql)內(nèi)容為例:
schema.sqlite.sql
復(fù)制代碼 代碼如下:
CREATE TABLE guestbook (
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
email VARCHAR(32) NOT NULL DEFAULT 'noemail@test.com',
comment TEXT NULL,
created DATETIME NOT NULL
);
CREATE INDEX "id" ON "guestbook" ("id");
如果不帶簽名,則文件的大小為232字節(jié),如果帶簽名,則文件大小為235字節(jié)。
UTF8簽名有3個字節(jié)(內(nèi)容為:EFBBBF),是專門用來告訴軟件:該文件是UTF8編碼的。
在一般情況下,有無簽名不會帶來問題,因為編輯器或者其他軟件可以按照文本的內(nèi)容來推斷出是否是UTF8。
但有些時候還是會導(dǎo)致問題,比如上訴文件。該文件是sql語句文件,程序恰好要通過以下語句(php)來執(zhí)行該sql:
復(fù)制代碼 代碼如下:
$schemaSql = file_get_contents(dirname(__FILE__) . '/schema.sqlite.sql');
$dbAdapter->getConnection()->exec($schemaSql);
在這種情況下,帶有簽名的文件就會導(dǎo)致問題了,因為“UTF8簽名用的三個字節(jié)”其實是位于文件的最前面。所以導(dǎo)致了上面的語句無法成功運行。
解決的辦法也很簡單,去掉該文件UTF8簽名即可。
當(dāng)然,上面文件的內(nèi)容其實都是單字節(jié)的,是沒有必要保存為UTF8編碼的。
補充:全部是單字節(jié)內(nèi)容的文件除非加了UTF8簽名,不然再次打開文件時,還是系統(tǒng)的默認(rèn)編碼而已。
相關(guān)文章
PHP stream_context_create()作用和用法分析
創(chuàng)建并返回一個文本數(shù)據(jù)流并應(yīng)用各種選項,可用于fopen(),file_get_contents()等過程的超時設(shè)置、代理服務(wù)器、請求方式、頭信息設(shè)置的特殊過程。2011-03-03php5.3不能連接mssql數(shù)據(jù)庫的解決方法
這篇文章主要介紹了php5.3不能連接mssql數(shù)據(jù)庫的解決方法,針對php5.3之后不支持mssql_connect函數(shù)提供了對應(yīng)的解決方法,具有一定的參考借鑒價值,需要的朋友可以參考下2014-12-12解決微信授權(quán)回調(diào)頁面域名只能設(shè)置一個的問題
在做項目集成微信登錄以及微信支付的時候,都需要進行用戶授權(quán)。本文主要介紹了關(guān)于網(wǎng)頁授權(quán)回調(diào)域名的說明以及解決微信授權(quán)回調(diào)頁面域名只能設(shè)置一個問題的方案。需要的朋友可以參考借鑒2016-12-12詳解PHP中的mb_detect_encoding函數(shù)使用方法
這篇文章主要介紹了詳解PHP中的mb_detect_encoding函數(shù)使用方法,包括對字符串編碼的轉(zhuǎn)換和判斷以及Call to undefined function mb_detect_encoding()錯誤的解決,需要的朋友可以參考下2015-08-08ThinkPHP中自定義目錄結(jié)構(gòu)的設(shè)置方法
現(xiàn)在很多朋友喜歡使用ThinkPHP但它會生成的很多目錄有些朋友不喜歡,這里為大家分享下將目錄都放到include目錄的方法,這樣就干凈多了2014-08-08