它是目前廣泛使用的XML解析器,用它編寫XML應用程序處理包含中文字符的XML文檔時,會出現字符編碼錯誤。
錯了,如何正確解決這個問題,對我們開發XML應用非常有用。本文給出了正確的處理方法和實現類的代碼,希望對專家們有所幫助。
1.背景介紹隨著XML技術的普及和應用,我國各行各業可能會產生大量包含漢字的XML文檔。盡管XML基於Java技術
Parser可以很好地處理這些XML文檔,但由於應用開發的復雜性,它不能解決所有問題,尤其是在中國。
顯然,我們知道,很多企業應用系統都是用C、C++、VB、Delphi、FoxPro等語言開發的。這些應用不能用Java語言重新實現,問題就來了。這些應用程序如何處理XML文檔,甚至是包含中文字符的XML文檔?目前XML解析器c++語言的實現非常有名,包括Apache組織的Xerces和IBM的XML4C。Aparche的Xerces來自IBM的XML4C。
所以它的編程接口是壹致的。兩者的關鍵區別在於字符編碼。在Xerces1.6之前,Apache只支持少數字符編碼,如ASCII、UTF-8、
UTF-16,UCS4,EBCDIC IBM 037 IBM 1140,ISO-8859-1和Windows-1252。所以采用Apache。
的Xerces ++解析器無法處理包含中文字符的XML文檔。IBM的XML4C最多支持100字符編碼,它結合了Xerces和國際組件Unicode (ICU)。因此,我們可以選擇XML4C作為XML的解析器。在使用XML4C之前,我們需要確認XML4C的bin目錄是否包含在系統路徑中,bin目錄必須有這些dll:Xerces-C _ 1 _ 6 _ 0d。DLL,icudt20.dll,icuuc20.dll和icuuc20d.dll。問題描述在XML4C的應用過程中,我發現調用XML4C
提供的壹些API不能很好的解決中文問題。比如解析XML時生成DOM_Document,用DOM方法得到壹個DOM_Node。
節點,為了獲取DOM_Node的名稱或值,需要調用DOM_Node。
GetNodeName()或getNodeValue()方法,並獲取DOMString對象。根據API
文件描述,DOMString類的transcode()方法,返回字符串的副本,並根據本地代碼頁對字符串進行編碼。所以,我在解析圖1。
並試圖獲取“愛國人士”節點的名稱,transcode方法返回不完整的節點名稱“愛國”。
而不是完全的“愛國人士”,這樣壹來,我們就無法利用這些信息進行字符串比較等操作,XML處理也會出現問題。因此,DOMString
的代碼轉換方法無法處理XML中的中文字符。class strformatarget public xmlformatarget public:char GetResult();strformatarget()XML文檔的編碼定義是由文檔頭#include定義的。