我的一个XML文件,要用在多个操作系统上面(各种语言版本的各种操作系统,98, me , 2000, xp),如果我选用GB2312,在某些操作系统下就用不来,比如英文的98.如果我选择UTF-8,当文件中有中文或其它非拉丁文字时,MSDOM也没法用这个文件,Load方法返回false.
怎样处理这个问题呢?有没有一种比较能用的编码方式?

解决方案 »

  1.   

    给文件加上你使用的编码格式的 signature就行了
      

  2.   

    Semigod() ( ) 信誉:93 
    怎样加啊?我不太懂!
      

  3.   

    jiangsheng(蒋晟.MSMVP2004Jan) ( ) 
    这个连接打不开
      

  4.   

    5. XML 中可以處理中文資訊嗎 ? 
    可以的. 所有符合 XML 規格的軟體工具一定都支援 ISO 10646 字集. ISO 10646 是一組龐大的字集, 而且是一項 ISO 標準。 其中包含了 Big5 中文碼及 GB2312 中文碼中所有的字. 但是 XML 的應用才剛起步, 所以目前大多數的 XML 軟體工具都尚未針對中文 資料進行測試。 (1998 年 12 月) 6. 可以直接使用中文的元素名稱 (Chinese element names) 嗎 ? 
    可以的. 所有符合 XML 規格的軟體工具一定都可以直接使用 中文的元素名稱 (Han ideographs for element names). 但是請注意上述所提的字集是指 ISO 10646 中的 "統一漢字字集" (unified Han characters)。 例如: 某些字在 GB2312 與 Big5 碼中 有不同的字形 (glyph, form or picture)。 但在 ISO 10646 中卻將 這些字的繁體字及簡體字統一 (unified) 為同一個字形。 註: 正確的 XML 軟體工具應確保將 Big5 或 GB2312 碼的資料轉換為 ISO 10646 時,其中的元素型別名稱 (element type names) 及屬性 (attributes) 等等的 XML 名稱 (names) 是 "正規化" (normalized) 為 "統一形式" (unified form) 而不是 "相容形式" (compatability form)。 對於 Big5 碼還有一個特殊的問題要考慮。 請參閱問題 18. 7. XML 中可以處理 Big5 碼的中文資訊嗎 ? 
    可能可以. 一個符合 XML 規格的軟體工具一定都支援 UTF-8 及 UTF-16 碼 (Unicode). 但是任何的字碼集 (character set) 都有可能用來編寫 XML 資料。 撰寫剖析器 (parser) 的設計決定其 XML 軟體工具支援那些字碼集。 在 XML 系統的處理範圍之外,文件內容是使用 Big5 碼。 
    在 XML 的系統中, 文件是以 ISO 10646 字碼.  註: 在 Java 環境中也是使用 ISO 10646 字碼。 這個字碼也 就是 Unicode。 
    您必須在每一個使用 Big5 碼的 XML 文件 (parseable entity) 檔中 一開始的部份加上下列的檔頭 (header):
       <?xml version="1.0" encoding="Big5"?> 
    為何一定要在 XML 文件中加上正確的字碼設定呢 ? 假如您的 XML 文件中沒有標明正確的字碼, XML 系統會拒絕處理這份 文件。 XML 的系統不再使用 HTML 系統的字碼猜測 (guessing) 的處 理方式,而採用明確標示 (explicit up) 的方式。 對於 Big5 碼還有一個特殊的問題要考慮。 請參閱問題 18. 8. XML 中可以處理 GB2312 碼的中文資訊嗎 ? 
    可能可以. 一個符合 XML 規格的軟體工具一定都支援 UTF-8 及 UTF-16 碼 (Unicode). 但是任何的字碼集 (character set) 都有可能用來編寫 XML 資料。 撰寫剖析器 (parser) 的設計決定其 XML 軟體工具支援那些字碼集。 在 XML 系統的處理範圍之外,文件內容是使用 GB2312 碼。 或是以 EUC 編碼 (EUC encoding) 的 GB2312 及 ASCII 碼, 也稱為 cn-euc 碼。 
    在 XML 的系統中, 文件是以 ISO 10646 字碼.  註: 在 Java 環境中也是使用 ISO 10646 字碼。 這個字碼也 就是 Unicode。 
    您必須在每一個使用 GB2312 碼的 XML 文件 (parseable entity) 檔中 一開始的部份加上下列的檔頭 (header):
        <?xml version="1.0" encoding="gb2312"?> 9. 如何知道某個 XML 軟體工具支援那些字碼 ? 
    在台灣中央研究院的 "Chinese XML Now!" 計劃提供了一些 相關資訊。此外廠商 也可以使用 中文處理能力標誌 (Chinese Numberplate logo) 來標示. 無論其工具 處理的能力如何,您都可以先將 XML 文件轉碼為 UTF-8 碼,則任何一個 XML 軟體工具就都可以使用了。
      10. 當我使用 Big5 碼,但是我要使用的字並不在標準字集中時,該如何解決呢 ? 
    可以使用 ISO 10646 統一字集 (universal character set) 中的任何的字。 假如是 Big5 或 GB2312 碼中的缺字,您就可以用 "數字字元參引" (numeric character reference) 的方式表示。 例如:
        &#x5ABC;
    中的 "5ABC" 是 ISO 10646 字集的順序,並以十六進位的方式表示。 您可以用 Windows NT 系統中的 "Character Map" 工具看到 ISO 10646 字集中的所有字形,也可以選用不同的字型。 假如您使用 ISO 10646 字集中的變體 (variant),您可以定義一個 元素型別 (element type) 及屬性 (attribute),就可以達到正確 顯示的目的了。例如您可以借用 HTML 中的 SPAN 元素型別 (element type), 然後使用樣式表 (stylesheet),也就是層級式樣式表 (Cascading Stylesheets: CSS) 就可以依照您的需求來切換字型了。 假如這個字不在 ISO 10646 的字集中,您就需要用造字區 (private-use character area) 了. 這與過去的做法並沒有任何改進 ! 希望將來有更好的系統可以引進到 XML 及 ISO 10646 中。 11. 目前免費又好用的 XML 軟體工具中, 那些可以處理中文資料呢 ? 
    XML 中文軟體工具中,目前 (1998/12) 最好的可能是 Internet Explorer 5.0 beta 版。 最好的 XML 剖析器 (parser) 可能是 IBM 公司的 XML Parser for Java。 最好的 XML/SGML 剖析器 (parser) 可能是 James Clark 的 SP software (C++)。 還有個使用 perl 語言撰寫的 XML 剖析器正在進行中。 12. 請談談關於 Web 伺服器 (server) 的轉碼 (Transcode) 問題 ? 
    有一些日本的 Web 伺服器 (server), 代理服務 (proxy) 或瀏覽器 (browser) 可以自動進行日文的Shift-JIS 及 EUC-J 碼之間的轉換。同樣也有其他語言 也有自動轉換,例如俄文。但目前我們還不知道有任何 Web 伺服器可自動進行 Big5 及 GB2312 碼之間的繁體簡體轉換。 但問題是無法完整的將 Big5 碼完整的轉換為 GB2312 碼,有些字 因為在 GB2312 碼中不存在,所以轉碼後這些字就會產生錯誤。 所以新一代的瀏覽器應該要使用 可認知 XML 的不掉字轉碼器 (XML-aware lossless transcoders) - 這個轉碼器會將 GB2312 碼中沒有的 字以數字字元參引 (Numeric Character Reference, NCR) 的方式表示。 但因為 XML 規格太新了,目前尚未有瀏覽器支援此項功能。 
      

  5.   

    15. 什麼是 xml:lang 這個標準屬性的用途呢 ? 
    每個 XML 元素 (element) 都可以有個 xml:lang 屬性, 來設定您的文件使用何種語言。這個屬性可以協助全文檢索系統及排版系統。 請將這個屬性加在您的中文 XML 文件的最前頭。 可以針對中文的設定值如下: xml:lang="zh" 表示中文資料; 
    xml:lang="zh-TW" 表示台灣使用的中文 (繁體字); 
    xml:lang="zh-HK" 表示香港使用的中文 (可能是繁體字); 
    xml:lang="zh-CN" 表示中國大陸使用的中文 (簡體字); 
    xml:lang="zh-SG" 表示新加坡使用的中文 (簡體字); 
    這個屬性看似簡單無奇,但是在您的文件中正確的標示使用何種語言 卻會影響深遠。如此這般,一個中文 Web 搜尋系統 (Web-Robot) 就可以 正確無誤的將您的文件加入其系統中,而西方語言的 Web 搜尋系統就可 以得知這些文件可能不該加入其系統中,或是可以啟動自動的翻譯系統。 因為在不同的地區所使用的中文詞彙有一部份不一樣,所以語言屬性 也可以協助自動翻譯及搜尋系統。 15a. 在一個文件內可以混合使用不同的中文字集嗎 ? 
    (1998-12-15) 可以的。文件內的每一個 XML 元素 (element) 都可以使用 "xml:lang" 屬性來設定這一個元素是使用何種語言。此處不是指字集編碼 (Big5 或 GB2312), 而是何種語言。例如:         <p xml:lang="zh-TW">...</p>表示這個元素 (element) 是使用台灣的中文。 
            <p xml:lang="zh-HK">...</p>表示這個元素 (element) 是使用香港的中文。 
            <p xml:lang="en-SG">...</p>表示這個元素 (element) 是使用新加坡的英文。 
            <p xml:lang="zh-CN-YUH">...<z xml:lang="en">blah;</z>...</p>表示這個元素 (element) p 是使用中國大陸的廣東話中文。 ("YUH" 是在 SIL Enthnologue 中代表廣東話的代碼,請參考下列網頁: http://www.sil.org/ethnologue/countries/Chin.html) 但是子元素 (subelement) z 是英文。(某些文字是使用拼音的方式表達; 這些部份是用於方言,不懂得這種方言就無法理解其意義。)&#65533; 
    當然,您也可以自訂屬性來達到您的需求:         <p xml:lang="zh-HK-simplified" traditional="OK">...</p>表示這個元素內的資料是使用簡體字的香港中文。 但是也可以使用 traditional="OK" 屬性來表示可以使用 繁體字字形。 
    使用 XML,您可以用標示 (up) 來描述文件中所有的資訊。 接著根據標示,您可以寫個程式,或是樣示表 (stylesheet), 或是報表產生程式來完成您的需求。。   
    16. 據說 Unicode 不是一組好的中文字集 (character set) ? Chinese! 
    Unicode 製定組織 (Unicode Consortium) 是許多的公司聯合決定製定一個包含全世界所有文字 的巨大字集,其中也有亞洲的公司參與。例如:Fujitsu and Fuji Xerox 公司。 該組織取用 ISO 10646 字集然後加入其他的資訊:標準名稱及 特性。 Unicode 包含 GB2312 中所有的字及(可能) Big5 碼中所有的字。 而且加入了許多其他語言的文字。(ISO 10646 有幾種編碼方式: UTF-8 是 8-bit 的,而 UTF-16 是 16-bit。 Unicode 是 UTF-16 的形式。 因此 Unicode 比 Big5 及 GB2312 碼好 - 因為 Unicode 包含較多的字。 但是 ISO 10646 碼有下列問題: UTF-16 或 Unicode 是 16-bit 固定長度的編碼,並沒有比 Big5 或 GB2312 碼提供更大的容納空間。而 8-bit 不定長 (variable-length) 的編碼,每個中文字使用 3 個位元組 (byte)。 這意味著使用 UTF-8 編碼的 XML 檔案會比使用 Big5 碼的檔案大上 50%。但是假如使用 ASCII 碼的標示 (Markup),檔案就不會大這麼多了。 標示大約會佔文件的 50%。可能要使檔案大小減少的方式就是採用 檔案壓縮了。 
    ISO 10646 碼中,字的順序與任何的中文碼並不同。無法使用一個 簡單的演算法 (algorithm) 就可以將 Big5 或 GB2312 碼轉換為 ISO 10646。您得用一個轉換表來進行轉碼。但另一方面,ISO 10646 碼的中文字序有利於排序 (sorting)。而且也去除了重複字,因而 對於檢索 (searching) 也有幫助。(據說 GBK 字集包含 ISO 10646 碼中所有的字,而且保留與 GB2312 碼相同的字序。在某些情形下 可能是個好字集。) 
    這就是為何 XML 檔不一定要用 UTF-8 或 UTF-16 編碼的原因。 您可以使用 Big5 或 GB2312 碼。但是很少 XML 軟體工具支援 這些中文字碼。所以建議您,以長遠眼光來探討,最好是轉移到 UTF-8 或 UTF-16。 17. 為何某個軟體工具的文件說明該軟體無法正確處理 Big5 碼文件, 但事實上卻可以用呢 ? 
    Big5 碼是一個以 "7-bit unsafe" "ASCII-family" 編碼的字集。 "ASCII-family" 編碼的字集 (ASCII, ISO646, ISO8859-*, UTF-8, EUC, Big5, GB2312) 中的 ASCII 字部份 都在 ASCII 字集表中的位置上。(也就是 'A' 的字碼為 65 (0x41)。) 所有的 ASCII 字都小於 128 (0x80)。 
    一個 "8-bit safe" 編碼的字集表示假如其中有一個位元組 (byte) 的值小於 128,那這個字一定是 ASCII 中的字。Shift-JIS 及 Big5 碼 都不是 8-bit unsafe,因為在多位元組 (multiple-byte) 字碼的第二 個位元組可能是小於 128 (0x80)。使用"8-bit safe" 編碼的好處是可以與 一些只處理以 ASCII 做為標示 (up) 的軟體工具相容。 
    "7-bit safe" 編碼是:假如有小於 64 (0x40) 的位元組 (byte) 就表示這是 個 ASCII 碼的字。Shift-JIS 及 Big5 碼不是 "8-bit safe" (因為 字碼中的第二個位元組可能小於 128 (0x80)) 但這些字碼是 "7-bit safe" (因為字碼中的第二個位元組一定大於 63 (0x3f))。"7-bit safe" 編碼 對於一些只將小於 64 (0x40) 的字認定為分隔符號 (&#eter) 的軟體工具是安全無慮的。在 XML 中,所有的 XML 分隔符號 (delimiter) [<>&%"'] 的值都小於 64 (0x40)。 
    這意味著會有許多的 XML 軟體工具可以處理 Big5 碼的文件。但這純屬 意外,因為嚴格來講,一個不認得 XML 標頭中的編碼屬性的 XML 系統, 應該產生錯誤訊息。特別的是,通常這些系統可能無法處理數字字元參引 (numeric character reference) (請參閱問題 10)。當然這些系統雖然 不符合標準,但還是有其用處的。 對於 Big5 碼還有一個特殊的問題要考慮。 請參閱問題 18. 18. 為何在處理有些 Big5 碼文件時會產生奇特的錯誤呢 ? 
    在某些系統中,Big5 碼的第二個 byte 會產生問題。因為 Big5 碼不是 "8-bit safe" (請參閱問題 17)。 這個問題只會在不將 Big5 碼文件轉為 "8-bit safe" 的內部格式 (例如:Unicode,UTF-8 或 UTF-16) 的系統中發生。在這些系統中, Big5 碼的某些位元組 (byte) 會被解譯為錯誤的字。 第一個狀況是您使用本地語言 (Native Language) 的標示 (例如:您使用中文做為元素名稱 (element names),屬性名稱 (attribute names),ID 屬性等等)。這個問題無解。如果您一定要用這類的軟體,您 就要在標示中避免使用第二個 byte 有問題的 Big5 字。 第二個狀況是您在 CDATA 段落 (section) 中使用下列中文字,而且 緊接著 "]>" 這個字串。解決的方法是,將這個 CDATA 段落分割為兩個 CDATA 段落,然後在其間夾雜一個特別的字元。下列 Big5 中文字的第二個 byte 都是 0x5D,也就是 ASCII 中的 "]" 字元。 兡也包因沘氓侷柵苗孫孫財
    崧淫設弼琶跑愍窟榜蒸奭稽
    霄瓢館縲擻鼕孃魔釁佉沎岠
    狋垚柛胅娭涘罞偟惈牻荺傒
    焱菏酡廅滘絺赩塴榗箂踃嬁
    澕蓴醊獧螗餟燱螬駸礑鎞瀧
    鄿瀯騬醹躕鱕 警告:我們還在檢視這些字。 
    (註:假如您不能看到上述的字,請參閱問題 19) 19. 為何我不能在 HTML 瀏覽器 (browser) 中看到所有的字呢 ? 
    您不能看到所有的字,可能是: 您的瀏覽器 (browser) 無法依據 HTML 4 或 XML 規則正確處理 數字字元參引 (numeric character reference);或是 
    您沒有安裝或選擇正確的字型; 
    您的瀏覽器使用 "encoding" 設定來決定使用那一個字型,但在這個 字型中並沒有文件中的某些字的字形。 
    試著改變瀏覽器上的功能選項中的 "Encoding" 項目切換為 Big5 或 UTF-8。 這項設定在不同的瀏覽器中,會放在不同的位置。 
    20. 什麼是 Big5/GCCS, EUDC 及 Big5+ 碼 ? 
    (1998-12-31) EUDC (Extended User-defined Characters) 是香港地區製定的一組 標準使用者造字 (user-defined characters)。(日文稱為 gaiji)&#65533;這些字包含 R&D EUDC, HKUST EUDC 及 GCCS EUDC。 Big5 碼是在台灣製定的,這些繁體字也在香港使用。但在香港有些字很少在 在台灣使用,因些香港政府將 Big5 字集再加上 3049 個字製定為 "政府中文字 集" (Government Chinese Character Set, GCCS),目前已廣為使用中。 台灣的行政院研究發展考核委員會(研考會)委託中文電腦推廣基金會(中推會) 進行 Big5 碼字集擴編,約為 24,066 字,稱為 Big5+ 碼。 請注意:Big5/GCCS, EUDC 及 Big5+ 碼並未在 IANA 註冊編碼名稱供 在 Internet 上使用。 為了將來可互通使用 (interoperability),請在 WWW 中的 HTML 及 檔中加上正確的標頭。假如您不知道確切的字集,e-commerce 就無法正確 運作了。假如您使用 Big5+ 碼,請在文件的標頭上加上註解或處理指令 (processing instruction)。在 XML 中,我們建議在文件的第二個標示 (tag) 寫上 "ascc-hint" 的處理指令並使用 "non-IANA" 屬性。 <?xml version="1.0" encoding="Big5" ?> <?ascc-hint non-IANA="Big5plus" ?> 及         <?xml version="1.0" encoding="Big5" ?>
            <?ascc-hint non-IANA="GCCS" ?>
      

  6.   

    jiangsheng(蒋晟.MSMVP2004Jan) ( ) 信誉:257,我还是没能找到解决方案。
    你知道,在一台新装的英文版的98下,是不能用GB2312等中文编码方式的,用UTF-8在支持中文的os上也不能支持含中文的xml文档。而且我还想支持其它的一些非拉丁文字,比如日文什么的。而xml文件又是要明确标识编码方式的,所以我想选择一种通用的编码方式来解决这个问题。如果没有的话,其它方法也可以考虑。
        我现在能想到的是对可能出现非标准字符的地方,用BASE64进行一次编码,这样应该用UTF-8可以全解决了。
      

  7.   

    98不支持UNICODE……不过2000就支持了。不过要正确显示UNICODE文字,需要安装代码页对应的字体
      

  8.   

    对,98还不支持unicode..jiangsheng(蒋晟.MSMVP2004Jan) ( ) 信誉:257 ,你觉得我的方法不会碰到别的难题了吗?我知道你是大牛,^_^
      

  9.   

    不用BASE64编码,XML自己支持
    10. 當我使用 Big5 碼,但是我要使用的字並不在標準字集中時,該如何解決呢 ? 
    可以使用 ISO 10646 統一字集 (universal character set) 中的任何的字。 假如是 Big5 或 GB2312 碼中的缺字,您就可以用 "數字字元參引" (numeric character reference) 的方式表示。 例如:
        &#x5ABC;
    中的 "5ABC" 是 ISO 10646 字集的順序,並以十六進位的方式表示。 您可以用 Windows NT 系統中的 "Character Map" 工具看到 ISO 10646 字集中的所有字形,也可以選用不同的字型。