溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

UTF-8文件中Unicode簽名BOM的示例分析

發(fā)布時(shí)間:2021-10-13 14:13:12 來(lái)源:億速云 閱讀:157 作者:小新 欄目:移動(dòng)開(kāi)發(fā)

這篇文章將為大家詳細(xì)講解有關(guān)UTF-8文件中Unicode簽名BOM的示例分析,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

UTF-8文件中Unicode簽名BOM的示例分析
近日在調(diào)測(cè)一個(gè)UTF8編碼的中文Zen Cart網(wǎng)站時(shí)遇到一件怪事,網(wǎng)頁(yè)顯示文字正常,用ie的察看源文件(記事本打開(kāi))卻發(fā)現(xiàn)亂碼,firefox沒(méi)有這個(gè)問(wèn)題。經(jīng)在網(wǎng)上多方查證和多次測(cè)試,解決了這個(gè)問(wèn)題,其實(shí)是UTF-8文件的Unicode簽名BOM(Byte Order Mark)問(wèn)題。

BOM(Byte Order Mark),是UTF編碼方案里用于標(biāo)識(shí)編碼的標(biāo)準(zhǔn)標(biāo)記,在UTF-16里本來(lái)是FF FE,變成UTF-8就成了EF BB BF。這個(gè)標(biāo)記是可選的,因?yàn)閁TF8字節(jié)沒(méi)有順序,所以它可以被用來(lái)檢測(cè)一個(gè)字節(jié)流是否是UTF-8編碼的。微軟做這種檢測(cè),但有些軟件不做這種檢測(cè),而把它當(dāng)作正常字符處理。

微軟在自己的UTF-8格式的文本文件之前加上了EF BB BF三個(gè)字節(jié), windows上面的notepad等程序就是根據(jù)這三個(gè)字節(jié)來(lái)確定一個(gè)文本文件是ASCII的還是UTF-8的, 然而這個(gè)只是微軟暗自作的標(biāo)記, 其它平臺(tái)上并沒(méi)有對(duì)UTF-8文本文件做個(gè)這樣的標(biāo)記。

也就是說(shuō)一個(gè)UTF-8文件可能有BOM,也可能沒(méi)有BOM,那么怎么區(qū)分呢?三種方法。1,用UltraEdit-32打開(kāi)文件,切換到十六進(jìn)制編輯模式,察看文件頭部是否有EF BB BF。2,用Dreamweaver打開(kāi),察看頁(yè)面屬性,看“包括Unicode簽名BOM”前面是否有個(gè)勾。3,用Windows的記事本打開(kāi),選擇 “另存為”,看文件的默認(rèn)編碼是UTF-8還是ANSI,如果是ANSI則不帶BOM。

我找到Zen Cart的模版文件中的html_header.php,發(fā)現(xiàn)文件果然不帶BOM,用UltraEdit-32另存為的方式加上BOM后,再上傳html_header.php,一切正常。

注意用Convertz把gb2312文件轉(zhuǎn)換成UTF-8文件時(shí),默認(rèn)設(shè)置是不帶BOM的。不帶BOM可能出現(xiàn)上述亂碼問(wèn)題,但是帶 BOM,對(duì)于php的include文件要小心,會(huì)在php字節(jié)流前面多出EF BB BF,提前輸出到顯示器有可能會(huì)帶來(lái)程序錯(cuò)誤。一個(gè)解決方案是凡是被include的文件都保存為ANSI,主文件可以是UTF-8。要想把一個(gè)文件去掉 BOM,使用UlterEdit打開(kāi), 切換到十六進(jìn)制編輯模式,把最前面三個(gè)字節(jié)(就是那該死的 EF BB BF)替換為20,保存(注意關(guān)閉保存時(shí)自動(dòng)備份的功能),再切換到默認(rèn)編輯模式,把最前面的三個(gè)空格去掉就可以了。

另外還學(xué)到一些編碼的小知識(shí):所謂的unicode保存的文件實(shí)際上是utf-16,只不過(guò)恰好跟unicode的碼相同而已,但在概念上unicode與utf是兩回事,unicode是內(nèi)存編碼表示方案,而utf是如何保存和傳輸unicode的方案。utf-16還分高位在前 (LE)和高位在后(BE)兩種。官方的utf編碼還有utf-32,也分LE和BE。非unicode官方的utf編碼還有utf-7,主要用于郵件傳輸。utf-8的單字節(jié)部分是和iso-8859-1兼容的,這主要是一些舊的系統(tǒng)和庫(kù)函數(shù)不能正確處理utf-16而被迫出來(lái)的,而且對(duì)英語(yǔ)字符來(lái)說(shuō),也節(jié)省保存的文件空間(以非英語(yǔ)字符浪費(fèi)空間為代價(jià))。在iso-8859-1的時(shí)候,utf8和iso-8859-1都是用一個(gè)字節(jié)表示的,當(dāng)表示其它字符的時(shí)候,utf-8會(huì)使用兩個(gè)或三個(gè)字節(jié)。

關(guān)于“UTF-8文件中Unicode簽名BOM的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI