前同天和同事在討論xml裡的encoding屬性和檔案格式的關係,終於徹底的弄清楚了。
以前理解的是,xml裡的encoding裡定義必須與檔案格式相符。即有這樣的xml Introduction xml encoding="utf-8" .. ?>,那麼,文件格式必須是一個utf-8文件,即文件的前兩個字節要是一個utf-8頭FF FE 。 (後來才弄清楚,FF FE不是utf-8的BOM。。就是說我的錯誤理解持續了相當長一段時間。。)
下面把討論的幾個階段大概說一下。
剛開始討論時,我很肯定的告訴他,encoding的值必須和文件格式(即BOM,BOM就是byte order mark的縮寫)相匹配,不然在解析XML時,可能會出現(比如文檔含有某個UNICODE字符,而encoding或BOM指定的格式不匹配,就會出錯,當時我是這樣的意思),然後他又告訴我,好像不是這樣,我用DELPHI創建的XML文件,沒有BOM,XML裡面有中文內容,encoding裡指定的是UTF-8,用IE可以正常打開啊。
他在發現他所建立的XML檔案沒有BOM時,有個有趣的地方,就是用UE開啟這類含有UNICODE字元的檔案時,UE會自動在檔案前面加上FF FE,使得檔案可以正常顯示,所以原本沒有BOM的文件,在UE下的十六進制下瀏覽,會看到多了個BOM,這個功能可以在UE的OPTIONS裡去掉的,想知道的可以自己去找找。
然後我有點大頭了,怎麼會這樣呢,然後想啊想,突然他發了一封訊息過來,內容如下:
W3C定義了三個XML解析器如何正確讀取XML檔案的編碼的規則:
1,如果文字封鎖有BOM(位元組順序標記,一般來說,如果儲存為unicode格式,則包含BOM,ANSI則無) ,就定義了檔案編碼
2,如果沒有BOM,就查看XML宣告的編碼屬性
3,如果上述兩個都沒有,就假定XML文擋採用UTF-8編碼
#有了這三條規則,那這個規則就清楚多了。
首先,XML解析器根據檔案的BOM來解析檔案;如果沒找到BOM,由用XML裡的encoding屬性指定的編碼;如果xml裡encoding沒指定的話,就預設用utf-8來解析文檔。然後又可以推出,BOM和ENCODING都有的話,則以BOM指定的為準。
啊!突然覺得有標準文件多好!雖然是那麼的理所當然。
至此,終於把xml裡的encoding和檔案格式的關係搞懂了。雖然這篇紀錄只有那幾百個字內容,但是我們當時在討論的時候,總時間差不多花了2個小時。 #
以上是關於xml裡的encoding的詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!