C++ Programmer's Cookbook

{C++ 基础} {C++ 高级} {C#界面,C++核心算法} {设计模式} {C#基础}

中文xml FQA

Chinese XML FAQ 
这份 "常见问题及解答" 是提供使用 XML 来处理中文文件的相关资讯。 关於处理 XML 或 SGML 
英文文件的 FAQ 请参考下列网页: 

John Lamp and Dave Megginson's comp.text.sgml FAQ at 
http://lamp.man.deakin.edu.au/sgml/sgmlfaq.txt; 
Peter Flynn's XML FAQ at http://www.ucc.ie/xml/ (this is also available in Japanese, 
Korean and Spanish: does anyone want to translate it into Chinese?). 
--------------------------------------------------------------------------------

1. 什麽是 XML ? 
XML 「可扩展标示语言」(eXtensible Markup Language) 是用於标示具有结构性资讯的电子文件
的标示语言。 XML 是根据一个国际标准 -- Standard Generalized Markup Language (SGML) 
-- International Organization for Standardization (ISO) ISO 8879:1986 所定而成的. 
XML 的格式类似 HTML, 但是您可以使用自行定义 的标及文件结构. 也可以由资料库中取得资料,
再用 XML 进行 串列化 (serializing) 的工作。 
--------------------------------------------------------------------------------

2. 谁在负责发展 XML ? 
ISO SGML 最初是由 IBM 公司所研发的, 但也接受了许多公司 的建议。 XML 是由 "全球资讯网发
展协会" (World Wide Web Consortium, W3C) 所发展的; WWW 的发明人 Tim Berners-Lee 先生是
 W3C 的主持人。 阳公司 (Sun Microsystems) 的主资讯结构师 (chief Information Architect)
  Jon Bosak 先生是 XML 计划主持人。 XML 的规格是由网景公司 (Netscape), 微软公司 (Microsoft)
   的代表及 一个称为 Text Encoding Initiative (TEI) 的大型学术 研究计划所共同起草定。
    W3C Special Interest Group (W3C XML SIG) 的成员包含:超过一百个公司及受邀 的专家。 
--------------------------------------------------------------------------------

3. 那些公司支持或使用 XML ? 
Microsoft, Netscape, Sun, IBM, Corel, Adobe, Oracle, RealAudio... 遍及各大电脑公司。 
--------------------------------------------------------------------------------

4. 我是否已经在使用 XML 了 ? 
大多数的 XML 的应用是隐含在系统内部的; 已有许多的应用使用 XML 技术来订定其专用的标
示语言 (specialist markup language). 例如: 

RealAudio 公司新版的 RealPlayer G2 采用 W3C 定的 
SMIL (Synchronized Media Interchange Language) 规格; 
Netscape 公司的 "What's Related" 功能采用 W3C 定的 RDF (Resource Description Framework) 
规格来运作; 
Microsoft 公司 Internet Explorer 软体中的 "频道" (Channels) 功能中所使用
 CDF (Channel Definition Format) 格式. 
--------------------------------------------------------------------------------

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 markup) 的方式。 

对於 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) 的方式表示。 
例如:
    媼
中的 "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 规格太新了,目前尚未有浏
 览器支援此项功能。 

要避免转码 (transcoding),您可以将文件的 MIME 类别设定为 application/xml。这样可能可
以避免文件被转码了。 假如您使用 Apache Web 伺服器,您可以做如下的设定:
  AddType application/xml XML xml

  ForceType application/xml

  DefaultType application/xml 

但是对於 HTML 资料,那些常用的浏览器 (Web browser) 使用了各种 的技巧来推测网页是使用
那一种字集编码 (character set encoding)。 这种情形可能会一直持续存在,甚至采用 
HTML-in-XML (也称为 "Voyager") 技术时 也会发生。 所以使用 application/xml 可以避免代理
服务 (proxy) 进行 转码,但是接受资料的这一端还是可能会随意 (lossy) 使用内建的转码 机制。
(请参阅问题 19) 
--------------------------------------------------------------------------------

13. 万一我的 Web 伺服器送出错误的字集资讯,怎麽办呢 ? 
大多数的 Web 伺服器并没有在 HTTP/MIME 标头 (header) 中 送出正确的字集资讯。实际状况是
有许多的 Web 伺服器并无法设定字集。 

下列是一些原则: 

将来 Web 伺服器会从 XML 文件中检视其中的字集标头 (encoding header)。:但是目前还不是如此,
因为 XML 太新了, 
假如您的网站只提供一种字集的文件,请将您的 Web 伺服器 设定为内定 (default) 送出这种字集资讯。 
假如您的 Web 伺服器支援 HTTP 1.1 协定中的内容沟通 (content negotiation),例如: Apache。 
而且您的文件有不同 语言的版本,伺服器端可以根据语言来选择适当语言版本的文件送出, 例如:
使用 file.xml.en 及 file.xml.cn) 等等的 档名,或是 
每个档案使用不同的目录,并使用 .htaccess 控制档来 进行语言的设定。 (对於 Apache 伺服器,
系统中要设定允许 "AllowOverride FileInfo" 的权限。请继续参考下一个问题。 
--------------------------------------------------------------------------------

14. 如何针对使用 Apache 伺服器者,使用 .htaccess 设定送出 正确的 HTTP/MIME 标头 (header) ? 
(未写完) 
对於 Apache 伺服器,系统中要设定允许 "AllowOverride FileInfo" 的权限。在任何的资料目录,可
以使用名为 .htaccess 的档案来控制。 [:在 MIME 的名词中, "encoding" 代表 "资料压缩"
 (compression);在 XML 的编码标头 (encoding header) 中, "encoding" 代表 "采用的字集"。] 
 可参考下列设定: 

     DefaultLanguage zh
   AddType application/xml XML xml 
为何一定要有正确的语言设定呢 ? 因为如此可以帮助全文检索系统。 

为何要将 XML 文件以 MIME 类别设定为 application/xml 送出, 而不以 text/xml 送出呢 ? 因为
如此之下,文件就不会被转码。 Big5 到 GB2312 的转码会导致 有些字会不见。(请参考问题 12)
--------------------------------------------------------------------------------


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 是英文。(某些文字是使用拼音的方式表达; 这些部份是用於方言,不懂得这
种方言就无法理解其意义。)? 
当然,您也可以自订属性来达到您的需求: 

        <p xml:lang="zh-HK-simplified" traditional="OK">...</p>

表示这个元素内的资料是使用简体字的香港中文。 但是也可以使用 traditional="OK" 属性来表示可
以使用 繁体字字形。 
使用 XML,您可以用标示 (markup) 来描述文件中所有的资讯。 接着根据标示,您可以写个程式,或
是样示表 (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 做为标示 (markup) 的软体工具相容。 
"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)?这些字包含 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" ?>
      


--------------------------------------------------------------------------------

posted on 2006-01-06 15:44 梦在天涯 阅读(814) 评论(1)  编辑 收藏 引用 所属分类: UML/XML

评论

# re: 中文xml FQA 2006-01-20 15:01 flying

请助!
上面的代码编译不过,提示说IXMLDOMDocument3Ptr没有定义!

在system32中没有msxml4a.dll ,而msxml4.dll 和 msxml4r.dll有.
请问:是因为缺那个DLL造成编译通不过的吗?如果是,这么解决啊!

恳求大侠帮助!!!!!!  回复  更多评论   


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


公告

EMail:itech001#126.com

导航

统计

  • 随笔 - 461
  • 文章 - 4
  • 评论 - 746
  • 引用 - 0

常用链接

随笔分类

随笔档案

收藏夹

Blogs

c#(csharp)

C++(cpp)

Enlish

Forums(bbs)

My self

Often go

Useful Webs

Xml/Uml/html

搜索

  •  

积分与排名

  • 积分 - 1683785
  • 排名 - 5

最新评论

阅读排行榜