xml的encoding與文件編碼關係

轉自:http://www.cnblogs.com/azol/articles/1137035.html

怕哪天找不到了就複製了一份。

前同天和同事在討論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的BOM請參考                       http://baike.baidu.com/view/126558.htm#sub5073178

關於UTF-8與unicode的關係:

unicode 是一種編碼表格,例如,給一個漢字規定一個代碼。類似 GB2312-1980, GB18030等,只不過字集不同。

一個unicode碼可能轉成長度爲一個BYTE,或兩個,三個,四個BYTE的UTF8碼,取決於unicode碼的值。英文unicode碼因爲值小於0x80,只要用一個BYTE的UTF8傳送,比送unicode兩個BYTEs快。 

UTF8是爲傳送unicode而想出來的“再編碼”方法罷了。 

UTF8轉unicode用我上面給的程序反算即可。





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章