php UTF8 文件的簽名問題
更新時(shí)間:2009年10月30日 21:54:26 作者:
在我們保存UTF8文本文件的時(shí)候,可以選擇帶簽名,或者不帶簽名。
也就是 有BOM 格式編碼,或者 無(wú)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個(gè)字節(jié)(內(nèi)容為:EFBBBF),是專門用來(lái)告訴軟件:該文件是UTF8編碼的。
在一般情況下,有無(wú)簽名不會(huì)帶來(lái)問題,因?yàn)榫庉嬈骰蛘咂渌浖梢园凑瘴谋镜膬?nèi)容來(lái)推斷出是否是UTF8。
但有些時(shí)候還是會(huì)導(dǎo)致問題,比如上訴文件。該文件是sql語(yǔ)句文件,程序恰好要通過(guò)以下語(yǔ)句(php)來(lái)執(zhí)行該sql:
$schemaSql = file_get_contents(dirname(__FILE__) . '/schema.sqlite.sql');
$dbAdapter->getConnection()->exec($schemaSql);
在這種情況下,帶有簽名的文件就會(huì)導(dǎo)致問題了,因?yàn)椤癠TF8簽名用的三個(gè)字節(jié)”其實(shí)是位于文件的最前面。所以導(dǎo)致了上面的語(yǔ)句無(wú)法成功運(yùn)行。
解決的辦法也很簡(jiǎn)單,去掉該文件UTF8簽名即可。
當(dāng)然,上面文件的內(nèi)容其實(shí)都是單字節(jié)的,是沒有必要保存為UTF8編碼的。
補(bǔ)充:全部是單字節(jié)內(nèi)容的文件除非加了UTF8簽名,不然再次打開文件時(shí),還是系統(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個(gè)字節(jié)(內(nèi)容為:EFBBBF),是專門用來(lái)告訴軟件:該文件是UTF8編碼的。
在一般情況下,有無(wú)簽名不會(huì)帶來(lái)問題,因?yàn)榫庉嬈骰蛘咂渌浖梢园凑瘴谋镜膬?nèi)容來(lái)推斷出是否是UTF8。
但有些時(shí)候還是會(huì)導(dǎo)致問題,比如上訴文件。該文件是sql語(yǔ)句文件,程序恰好要通過(guò)以下語(yǔ)句(php)來(lái)執(zhí)行該sql:
復(fù)制代碼 代碼如下:
$schemaSql = file_get_contents(dirname(__FILE__) . '/schema.sqlite.sql');
$dbAdapter->getConnection()->exec($schemaSql);
在這種情況下,帶有簽名的文件就會(huì)導(dǎo)致問題了,因?yàn)椤癠TF8簽名用的三個(gè)字節(jié)”其實(shí)是位于文件的最前面。所以導(dǎo)致了上面的語(yǔ)句無(wú)法成功運(yùn)行。
解決的辦法也很簡(jiǎn)單,去掉該文件UTF8簽名即可。
當(dāng)然,上面文件的內(nèi)容其實(shí)都是單字節(jié)的,是沒有必要保存為UTF8編碼的。
補(bǔ)充:全部是單字節(jié)內(nèi)容的文件除非加了UTF8簽名,不然再次打開文件時(shí),還是系統(tǒng)的默認(rèn)編碼而已。
您可能感興趣的文章:
相關(guān)文章
PHP stream_context_create()作用和用法分析
創(chuàng)建并返回一個(gè)文本數(shù)據(jù)流并應(yīng)用各種選項(xiàng),可用于fopen(),file_get_contents()等過(guò)程的超時(shí)設(shè)置、代理服務(wù)器、請(qǐng)求方式、頭信息設(shè)置的特殊過(guò)程。2011-03-03php5.3不能連接mssql數(shù)據(jù)庫(kù)的解決方法
這篇文章主要介紹了php5.3不能連接mssql數(shù)據(jù)庫(kù)的解決方法,針對(duì)php5.3之后不支持mssql_connect函數(shù)提供了對(duì)應(yīng)的解決方法,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2014-12-12解決微信授權(quán)回調(diào)頁(yè)面域名只能設(shè)置一個(gè)的問題
在做項(xiàng)目集成微信登錄以及微信支付的時(shí)候,都需要進(jìn)行用戶授權(quán)。本文主要介紹了關(guān)于網(wǎng)頁(yè)授權(quán)回調(diào)域名的說(shuō)明以及解決微信授權(quán)回調(diào)頁(yè)面域名只能設(shè)置一個(gè)問題的方案。需要的朋友可以參考借鑒2016-12-12詳解PHP中的mb_detect_encoding函數(shù)使用方法
這篇文章主要介紹了詳解PHP中的mb_detect_encoding函數(shù)使用方法,包括對(duì)字符串編碼的轉(zhuǎn)換和判斷以及Call to undefined function mb_detect_encoding()錯(cuò)誤的解決,需要的朋友可以參考下2015-08-08ThinkPHP中自定義目錄結(jié)構(gòu)的設(shè)置方法
現(xiàn)在很多朋友喜歡使用ThinkPHP但它會(huì)生成的很多目錄有些朋友不喜歡,這里為大家分享下將目錄都放到include目錄的方法,這樣就干凈多了2014-08-08