天天看點

從XML檔案亂碼問題,探尋其背後的原理

出現應用程式讀取XML檔案亂碼的場景:

加入xml檔案以<?xml version="1.0" encoding="utf-8" ?> 格式的;如果對xml檔案進行修改了,其中包含中文字元的内容,另存為其他格式化時(比如unicod,ANSI)等等格式,則新儲存的配置檔案,程式讀取時候将會出現亂碼,不能正常的讀取。

驗證如下方法:

(1)、可以将XML檔案拖放在IE浏覽器上,會出現XML檔案無法正常的在浏覽器上面渲染。

(2)、通過Visual studio 打開該XML檔案,會出現加載格式錯誤!

從XML檔案亂碼問題,探尋其背後的原理
從XML檔案亂碼問題,探尋其背後的原理
從XML檔案亂碼問題,探尋其背後的原理
從XML檔案亂碼問題,探尋其背後的原理

在日常開發工作中,我們經常會使用到XML,早已成為了一種标準。它的用途非常的廣泛,但這些不是本文所重點讨論的。

相信大家在做開始時候經常碰到過“亂碼”的問題,這是中國程式員非常頭疼的問題。我一直很想深入研究關于“編碼”的原理,無奈水準有限,那些枯燥的理論(二進制,ASCII,Unicode,UTF-8,gb2312,ISO ...光這些就讓我看的兩眼發黑了),實在看不下去,也很難真正搞懂搞明白。望各位網友多指點......

我将用工作中遇到的一個“XML檔案亂碼”的簡單問題,解決問題,分析其背後的原理。

首先,我們在本地建立一個文本檔案,将字尾名改為".XML”, 然後用用記事本打開,往裡面添加一些符合XML文檔規範的内容。如圖所示:

從XML檔案亂碼問題,探尋其背後的原理

寫好之後,按“ctrl+s”儲存,然後使用IE浏覽器打開該XML檔案,驗證該XML文檔的規範及正确性。不料,居然解析出錯了,如下:

從XML檔案亂碼問題,探尋其背後的原理

這是咋回事呢?我的XML文檔定義的格式好像沒問題啊。無效字元?這肯定是典型的“編碼”問題了。聰明的我第一就想到了,調整IE浏覽器的“編碼”嘛。

可是打開“檢視”“編碼”,發現那些編碼格式全是灰色的,好像不能選擇哦。這是因為,在定義XML文檔的時候,指定了編碼格式為"UTF-8",這就相當于告訴了浏覽器(XML解析引擎):你必須使用"UTF-8"編碼去解析我,是以無法使用其他的編碼格式去檢視了。

這是因為,我們在使用記事本儲存該文檔的時候,沒有選擇編碼格式,預設使用的是作業系統編碼(中文版的系統),也就是對應的"GB2312”編碼。當我們的IE浏覽器,再使用我們指定的UTF-8編碼去解析該XML文檔的時候,出現了亂碼,是以造成了上面的錯誤。(Windows中的檔案儲存在硬碟上,預設使用作業系統編碼。比如我們XML文檔中定義的“中國”這兩個字,儲存好後,假如其對應的GB2312可能是"10001",而在UTF-8編碼中的,“10001”對應的就不是“中國”了,要麼找不到,要麼是亂碼,是以IE就拒絕顯示了)。那我們應該怎麼辦呢?有兩種辦法可以解決。

第一,我們在xml文檔定義時,指定其編碼為gb2312,如下圖所示:

從XML檔案亂碼問題,探尋其背後的原理

儲存之後,我們再使用IE浏覽器打開,結果如圖:

從XML檔案亂碼問題,探尋其背後的原理

恭喜,這個問題解決了。但是這種方法不推薦使用。因為我們在定義XML文檔時候,為了文檔的通用性,我們一般使用UTF-8編碼。

第二種方法:

我們再用記事本打開該文檔,點選“另存為”,發現下面會有“編碼”選項,選擇“UTF-8”之後再試。

其實,我們在使用諸如 Eclipse 或者Microsoft Visual Studio之類的開發工具來定義XML文檔,并不會碰到上面的問題。原因是這些IDE都非常“聰明”,你的XML文檔指定的是那種編碼格式,IDE在将XML文檔儲存到硬碟的時候,就自動使用那種格式。是以,很多局限于使用某種IDE開發的程式員,其實并不明白這些知識及其背後的原理,但他們做開發起來一樣很順手。早年據筆者了解,國内有很多大牛,寫代碼都是用EditPlus之類的文本編輯器,而那些在Linux/unix上面的大牛,很多都是用VI/VIM來編碼。大概這就是差距吧。(呵呵。當然這不是本文讨論的重點)