国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

首頁 > 學院 > 開發(fā)設計 > 正文

XML 數(shù)據(jù)的編碼方式

2019-11-18 21:10:11
字體:
供稿:網(wǎng)友
Chris Lovett
Microsoft Corporation
2000 年 3 月

目錄

1、跨平臺數(shù)據(jù)格式
2、xml 和字符編碼
3、字符集和 MSXML DOM
4、用 MSXML 創(chuàng)建新的 XML 文檔
5、結(jié)論
6、有關(guān)詳細信息


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

摘要:本文介紹了字符編碼的工作原理,特別是在 XML 和 MSXML DOM 中的工作原理。

近來很多人問我,如何使 XML 文件在不同的平臺間正確地傳遞數(shù)據(jù)。他們創(chuàng)建了 XML 文檔,鍵入了數(shù)據(jù),粘上了幾個標記,調(diào)整了標記的格式,甚至放入了 <?xml version="1.0"?> 聲明,作為額外增添。然后他們試著裝載它,可得到的卻是意想不到的出錯消息,Microsoft(R) XML Parser (MSXML) 報告說數(shù)據(jù)有問題。對初編 XML 者來說,這真令人沮喪。難道它竟不能正常工作嗎?

當然不是。當從 MSXML 收到意想不到的出錯消息時,很可能是因為接收數(shù)據(jù)的平臺將其存儲到了與發(fā)送數(shù)據(jù)不同的平臺上,結(jié)果導致了字符編碼問題。

跨平臺數(shù)據(jù)格式
自從計算機軟件和硬件從業(yè)人員設法將兩臺計算機連接到一起以來,他們就一直向著創(chuàng)建跨平臺技術(shù)并使不同的平臺能夠共享數(shù)據(jù)的領域而努力奮斗。很早以來,由于不同類型的計算機的數(shù)量、連接方式、希望共享的數(shù)據(jù)種類的急劇增加,事態(tài)也就變得越來越復雜。

經(jīng)過幾十年關(guān)于跨平臺編程技術(shù)的研究,當今(而且可能在未來的很長一段時期內(nèi))唯一的真正跨平臺解決方案是通過簡單的標準數(shù)據(jù)格式得到的。Web 的成功正是建立在這種格式上的。在 Web 服務器和 Web 瀏覽器之間傳遞的主要內(nèi)容是 HTTP 標題和 HTML 頁,兩者都是標準的文本格式。

在以下幾節(jié)中,我將討論字符編碼和標準字符集、Unicode、HTML Content-Type 標題、HTML Content-Type 元標記和字符實體。如果您熟悉上述概念,可跳過這些內(nèi)容去讀 encoding XML data for the XML Document Object Model (DOM) PRogrammer(針對 XML 文檔對象模型 (DOM) 編程人員的編碼 XML 數(shù)據(jù))的提示和技巧。有關(guān)詳細信息,請參閱 XML and Character Encoding(XML 和字符編碼)。

關(guān)于字符編碼
標準文本格式是建立在標準字符集之上的。要記住,所有的計算機均將文本存儲為數(shù)字。然而,不同的系統(tǒng)也可以用不同的數(shù)字存儲相同的文本。下表顯示了一組字節(jié)是如何被存儲的,第一個是使用默認代碼頁 1252、運行 Microsoft Windows(R) 的典型計算機,第二個是使用 Macintosh Roman 代碼頁的典型 Apple(R) Macintosh(R) 計算機。

Byte Windows Macintosh
140 &#338; &aring;
229 &aring; &Acirc;
231 &ccedil; &Aacute;
232 è &Euml;
233 é &Egrave;


比方說,如果您的祖母從 http://www.barnesandnoble.com/(英文)訂購了一本新書,她不會想到她的 Macintosh 計算機存儲字符的方式,并不同于運行 www.barnesandnoble.com(英文)的新 Windows 2000 Web 服務器。在往 Internet 訂購單的發(fā)貨欄中輸入瑞典家中的地址時,她相信 Internet 會正確地傳遞字符 &aring;(在其 Macintosh 上的字節(jié)值是 140),并沒想到接收和處理她發(fā)送消息的計算機會將字節(jié)值 140 轉(zhuǎn)換為字母 &#338;。

Unicode
Unicode Consortium(統(tǒng)一碼協(xié)會)確信(用雙字節(jié)而不是單字節(jié)表示每個字符)定義一個通用的代碼頁是個好主意,該代碼頁適用于全世界所有的語言,從而不同代碼頁之間的映射問題將不復存在。

既然如此,如果 Unicode 解決了跨平臺的字符編碼問題,那為何它卻未成為唯一的標準呢?第一個問題是,轉(zhuǎn)換到 Unicode 有時意味著使所有的文件大小加倍 — 這樣做在網(wǎng)絡世界中是不可想象的。因此有人仍樂于使用老的、單字節(jié)的字符集,如 ISO-8859-1 到 ISO-8859-15、Shift-JIS、EUC-KR 等等。

第二個問題是,仍存在許多并非基于 Unicode 的系統(tǒng),這就意味著在網(wǎng)絡上,某些組成 Unicode 字符的字節(jié)值可能會給那些更舊的系統(tǒng)造成嚴重問題。因此定義了“Unicode 轉(zhuǎn)換格式 (UTF)”;它們運用位轉(zhuǎn)換技術(shù)對 Unicode 字符進行編碼,使其成為在老系統(tǒng)上“透明的”(或可安全通過)的字節(jié)值。

此類字符編碼中最普及的是 UTF-8。UTF-8 采用 Unicode 標準的前 127 個字符(它們恰好是基本的拉丁文字符:A-Z、a-z 和 0-9,以及幾個標點字符),并直接將其映射到單字節(jié)值。然后采用位轉(zhuǎn)換技術(shù),用字節(jié)的高位來編碼 Unicode 字符的其余部分。這樣做的結(jié)果是,小瑞典字符 &aring; (0xE5) 變成了下列雙字節(jié)亂碼:&Atilde;&yen; (0xC3 0xA5)。所以,除非您能夠在腦海里進行位轉(zhuǎn)換,否則,在UTF-8 中編碼的數(shù)據(jù)是無法被人讀懂的。

Content-Type 標題
因為更舊的單字節(jié)字符集仍被使用,所以只有當指定了數(shù)據(jù)所在的實際字符集之后,傳輸數(shù)據(jù)的問題才能得以解決。認識到這一點后,Internet 電子郵件和 HTTP 協(xié)議小組定義了一種標準方法,用以在消息標題 Content-Type 屬性中指定字符集。該屬性從注冊的字符集名稱列表中指定一個字符集,該字符集名稱是由 Internet Assigned Numbers Authority (IANA)定義的。典型的 HTTP 標題都可能包含下列文本:

HTTP/1.1 200 OK
Content-Length: 15327
Content-Type: text/html; charset:ISO-8859-1;
Server: Microsoft-IIS/5.0
Content-Location: http://www.microsoft.com/Default.htm
Date: Wed, 08 Dec 1999 00:55:26 GMT
Last-Modified: Mon, 06 Dec 1999 22:56:30 GMT

該標題向應用程序表明,跟在標題后面的內(nèi)容位于 ISO-8859-1 字符集中。

Content-Type 元標記
Content-Type 屬性是可選項,在有些應用程序中,HTTP 標題的信息被去掉了,而只有 HTML 本身通過。為了補救這一點,HTML 標準小組定義了一種可選的元標記方法,用于指定 HTML 文檔本身的字符集,使 HTML 文檔字符集是自描述的。

<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=ISO-8859-1">

在這種情況下,字符集 ISO-8859-1 說明在此特定的 HTML 頁中,字節(jié)值 229 表示 &aring;?,F(xiàn)在該頁對任何系統(tǒng)來說,都是完全清楚的,數(shù)據(jù)不會被曲解。遺憾的是,由于此元標記是可選的,所以它給錯誤留下了空子。

字符實體
不是所有的系統(tǒng)支持所有的注冊字符集。例如,我并不認為很多平臺實際上可支持稱為 EBCDIC 的 IBM 主機字符集。Windows NT 是支持的,但許多其他系統(tǒng)很可能不支持 — 這大概就是 http://www.ibm.com(英文)主頁為什么生成 ASCII 的原因。

作為備選方案,HTML 允許通過指定確切的 Unicode 字符值,對該頁中的單個字符進行編碼。然后將這些字符實體進行脫離字符集的分析,即可確切地確定其 Unicode 值。它的語法是 ?amp;#229;?or ?amp;#xE5;?。

XML 和字符編碼
XML 從 HTML 那里借鑒了這些思想,并使之更進一步,定義了一個徹底明確的算法,以確定編碼使用的字符集。在 XML 中,由 XML 聲明中的可選編碼屬性定義字符編碼。下列算法確定默認的編碼:

如果文件以 Unicode 字節(jié)次序標志 [0xFF 0xFE] 或 [0xFE 0xFF] 開頭,則認為該文檔是在 UTF-16 編碼中。否則,它在 UTF-8 中。

以下是所有正確和等效的 XML 文檔:

字符集或編碼 HTTP 標題 XML 文檔
ISO-8859-1 Content-Type: text/xml; charset:ISO-8859-1; <test>&aring;lt;/test>
UTF-8 Content-Type: text/xml; <test>&Atilde;&yen;</test>
ISO-8859-1 Content-Type: text/xml; <?xml version="1.0" encoding="ISO-8859-1"?>
<test>&aring;lt;/test>
UTF-8(用字符實體) Content-Type: text/xml; <test>&#229;</test>
UTF-16(帶字節(jié)次序標志的 Unicode) Content-Type: text/xml; ff fe 3c 00 74 00 65 00 73 00 74 00 3e 00 e5 00 ..<.t.e.s.t.>...
3c 00 2f 00 74 00 65 00 73 00 74 00 3e 00 0d 00 <./.t.e.s.t.>...
0a 00


字符集和 MSXML DOM
現(xiàn)在,討論過不同的字符編碼方法之后,讓我們來看看如何在 MSXML DOM 中加載 XML 文檔,以及當碰到模糊編碼的字符時,可能收到的出錯消息的類型。加載 XML DOM 文檔的兩個主要方法是 LoadXML 方法和 Load 方法。

LoadXML 方法總是采用只在 UCS-2 或 UTF-16 中編碼的 Unicode BSTR。如果將非有效的 Unicode BSTR 的內(nèi)容傳遞給 LoadXML,則加載會失敗。

Load 方法可將以下內(nèi)容當作 VARIANT:

Value Description
URL 如果 VARIANT 是 BSTR,則將其理解為 URL。
VT_ARRAY | VT_UI1 VARIANT 也可以是包含原始編碼字節(jié)的 SAFEARRAY。
IUnknown 如果 VARIANT 是 IUnknown 接口,則 DOM 文檔為 IStream、IPersistStream 和 IPersistStreamInit 調(diào)用 QueryInterface。


Load 方法實現(xiàn)以下算法,用于確定 XML 的字符編碼或字符集。

如果 Content-Type HTTP 標題定義了字符集,該字符集則替代 XML 文檔本身的所有內(nèi)容。因為沒有 HTTP 標題,所以這顯然不適用于 SAFEARRAY 和 IStream 機制。


如果有雙字節(jié) Unicode 字節(jié)次序標志,則它假設編碼是 UTF-16。它既可處理大 endian,也可處理小 endian。


如果有四字節(jié) Unicode 字節(jié)次序標志 (0xFF 0xFE 0xFF 0xFE),則它假設編碼是 UTF-32。它既可處理大 endian,也可處理小 endian。


否則,它假設編碼是 UTF-8,除非它用指定其他一些字符集的編碼屬性(如 ISO-8859-1、Windows-1252、Shift-JIS 等),找到 XML 聲明。
您將看到兩個從 XML DOM 返回的指出編碼問題的出錯消息。第一個通常指出文檔中的字符與 XML 文檔的編碼不匹配:

在文本內(nèi)容中發(fā)現(xiàn)了一個無效字符。

ParseError 對象可告訴您這個搗亂字符在某一行的確切位置,以便使您解決該問題。

第二個出錯消息指出您一開始用的是 Unicode 字節(jié)次序標志(或調(diào)用了 LoadXML 方法),然后編碼屬性指定了不是雙字節(jié)編碼的編碼(如 UTF-8 或 Windows-1250):

不支持從當前編碼轉(zhuǎn)換到指定的編碼。

另外,您可能調(diào)用了 Load 方法,并在一開始使用了單字節(jié)編碼(沒有字節(jié)次序標志),但是它隨后發(fā)現(xiàn)了指定雙字節(jié)或四字節(jié)編碼(如 UTF-16 或 UCS-4)的編碼屬性。

基本原則是不能利用 XML 聲明的編碼屬性,在多字節(jié)字符集如 UTF-8、Shift-JIS 或 Windows-1250,與 Unicode 字符編碼如 UTF-16、UCS-2 或 UCS-4 之間進行轉(zhuǎn)換,這是因為聲明本身必須對每個字符都使用與文檔其余部分相同數(shù)量的字節(jié)。

最后,IxmlhttpRequest 接口提供如下方法,用以訪問下載的數(shù)據(jù):

Methods Description
ResponseXML 表示由 MSXML DOM 分析器分析的響應實體(用與 Load 方法相同的規(guī)則)。
ResponseText 表示作為字串的響應實體。本方法盲目地解碼從 UTF-8 收到的消息實體。這是一個已知問題,應在即將面市的 MSXML Web Release 中得到解決。
ResponseBody 表示作為無符號字節(jié)數(shù)組的響應實體。
ResponseStream 表示作為 IStream 接口的響應實體。


用 MSXML 創(chuàng)建新的 XML 文檔
一旦加載了 XML 文檔,即可用 DOM 處理 XML 文檔,而不必考慮任何編碼問題,因為文檔是作為 Unicode 存儲在內(nèi)存中的。所有 XML DOM 接口都是基于 COM BSTR 的,后者是雙字節(jié)的 Unicode 字串。這就是說,您可以從新開始在包含所有 Unicode 字符的內(nèi)存中建立 MSXML DOM 文檔,并且所有組建將會共享該內(nèi)存中的 DOM,而不會對 Unicode 字符值的意思有任何疑惑。然而,當對其進行保存時,MSXML 將以默認方式按 UTF-8 編碼所有數(shù)據(jù)。例如,假設您進行了以下處理:

var xmldoc = new ActiveXObject("Microsoft.XMLDOM")
var e = xmldoc.createElement("test");
e.text = "&aring;;
xmldoc.appendChild(e);
xmldoc.save("foo.xml");

下列 UTF-8 編碼文件的結(jié)果是:

<test>&Atilde;&yen;</test>

注意 上述例子只有當在瀏覽器以外的環(huán)境運行時,才有效。由于受到安全限制,在瀏覽器里調(diào)用 Save 方法將不會產(chǎn)生相同的結(jié)果。

盡管這看上去有點怪,但卻是正確的。下列測試裝載了用 UTF-8 編碼的文件,并測試 UTF-8 是否被重新解碼為 Unicode 字符值 229。它是:

var xmldoc = new ActiveXObject("Microsoft.XMLDOM")
xmldoc.load("foo.xml");
if (xmldoc.documentElement.text.charCodeAt(0) == 229)
{
    WScript.echo("Yippee - it worked !!");
}

要想更改 XML DOM Save 方法使用的編碼,需要用如下位于文檔頂部的編碼屬性創(chuàng)建 XML 聲明:

var pi = xmldoc.createProcessingInstruction("xml",
                        " version='1.0' encoding='ISO-8859-1'");
xmldoc.appendChild(pi);

調(diào)用 save 方法時,您就會得到以下用 ISO-8859-1 編碼的文件:

<?xml version="1.0" encoding="ISO-8859-1"?>
<test>&aring;lt;/test>

現(xiàn)在,小心不要被 XML 屬性迷惑。XML 屬性返回 Unicode 字串。如果在創(chuàng)建 ISO-8859-1 編碼聲明之后,調(diào)用 DOMDocument 對象上的 XML 屬性,即可取回以下 Unicode 字串:

<?xml version="1.0"?>
<test>&aring;lt;/test>

請注意這里沒有 ISO-8859-1 編碼聲明了。這是正常的。這樣做的原因是使您可以轉(zhuǎn)而用此字串調(diào)用 LoadXML,它會起作用。如果它不這么做,LoadXML 會失敗并返回出錯消息:“不支持從當前編碼切換到指定的編碼?!?br>
結(jié)論
但愿本文有助于解釋字符編碼的工作原理,特別是在 XML 和 MSXML DOM 中的工作原理。一旦您理解了字符集編碼,它是相當簡單的,而且 XML 是非常出色的,因為它在這方面未留有絲毫含糊的余地。盡管 MSXML DOM 有幾處怪異需要密切留意,但它仍不失為一個能讓您讀取和寫入任何 XML 編碼的強大工具。

有關(guān)詳細信息
Microsoft MSDN Online Library: XML DOM Reference(Microsoft MSDN 聯(lián)機庫:XML DOM 引用)


Character Encoding Model(字符編碼模型),作者:Ken Whistler 和 Mark Davis


IANA Character Sets(IANA 字符集)


http://www.ietf.org(英文)的 Internet Engineering Task Force (IETF) 提供了 RFC 列表


Microsoft MSDN Online Library: Compatibility Issues with Mixed Environments(Microsoft MSDN 聯(lián)機庫:與混合環(huán)境的兼容性問題)



發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
午夜在线不卡| 国产91在线视频蝌蚪| 国产午夜电影| 黄色毛片在线看| 亚洲精品xxxxx| 91欧美在线视频| 国产成人精品自线拍| 中文字幕日本在线| 黄色电影网站在线观看| 日本在线视频www鲁啊鲁| 精品电影在线| av高清资源| 91亚洲天堂| 亚洲夜夜综合| 国产中文在线视频| 中文字幕在线永久在线视频| 国产亚洲精品自在线观看| 国产亚洲精品久久久网站好莱| 最近中文字幕在线中文视频| 午夜视频99| 精品国语对白精品自拍视| 精品街拍一区二区| 热99在线观看| 国产色婷婷在线| 在线免费观看高清视频色| 性欧美精品xxxx| 国产女人在线视频| 中文字幕在线影视资源| 国产黄色片大全| 香蕉视频网站在线播放| 国产免费网址| eeuss影院在线观看| 国产午夜电影| 日本高清不卡中文字幕| 国产高清免费av在线| 免费看成年人视频在线观看| 国产色婷婷在线| 免费的黄网站在线观看| 精品国产一区二区三区不卡在线| 久热久精久品这里在线观看| 国产激情在线| 国产在线一二| 91蜜桃在线视频| 成人超碰在线| 日本一卡二卡四卡精品| 精品全国在线一区二区| 国产麻豆免费| 欧美韩日国产| 亚洲xxxxxx| 在线色视频观看| 97人人在线| 国产一二区在线| 天堂中文在线视频| 狠狠综合久久久综合| 欧美卡一卡二| 免费的黄网站在线观看| www在线视频| 国产导航在线| 69精品视频| 2021天堂中文幕一二区在线观| 国产精品一区二三区| 青草av在线| 四虎国产精品永久| 亚洲大香人伊一本线| 国产www视频在线观看| 国产色在线播放| 国产啊啊啊视频在线观看| 国产三级视频在线看| 最近中文字幕av免费高清| √天堂中文在线| 国产精品入口麻豆免费| 国产精品区一区二| 国产福利在线| 在线播放av网站| gogo在线高清视频| 麻豆精品不卡国产免费看| 国自产拍在线网站网址视频| 国产中文字幕第一页| 中文字幕在线影视资源| 69久久久久| 亚洲大香人伊一本线| 国产伦精品一区二区三区高清版禁 | 国产偷激情在线| 精品伦理一区二区| 在线观看视频污| 黄网在线免费| 精品一区二区三区免费站| 热99在线观看| 国产黄色一级片| 免费a级在线播放| 国产福利小视频在线| 四虎一区二区三区| 国产色在线观看| 久久99亚洲网美利坚合众国| 91麻豆福利| 国产精品剧情一区二区三区 | 国产一级片麻豆| 操人视频91| 日本三级视频网站| 亚洲伊人网在线观看| 91嫩草在线播放| 国产99在线|亚洲| 2021天堂中文幕一二区在线观| 国产精品自产拍在线网站| 狠狠干天天干| 天堂资源在线中文| 天天操夜夜操天天射| 最近久乱中文字幕| 天堂中文字幕在线| av首页在线| 最近久乱中文字幕| 成年网在线观看免费观看网址| 国产娇喘精品一区二区三区图片| 天堂在线免费av| 日韩国产成人| 国产成免费视频| 国产日韩欧美精品一区二区三区| 国产麻豆麻豆| 日韩a视频在线观看| 国产视频一二三区| 超碰在线人人| 日本黄在线观看| aaa大片在线观看| www.综合网.com| 国产视频青青| 天天操人人爽| 尤物视频在线免费观看| wwww亚洲| 丝袜理论片在线观看| 超碰在线国产| www.91在线播放| 日本视频一二三区中文字幕| 99久久免费精品国产免费| 国产l精品国产亚洲区在线观看| 91麻豆福利| 精品一区二区观看| 国产午夜电影| 国产一二三区在线| 国产亚洲精品拍拍拍拍拍| 亚洲高清在线免费| 亚洲an天堂an在线观看| 丁香在线视频| 国产乱精品一区二区三区| 国产农村av| 自拍亚洲国产| 18av在线播放| 天天操夜夜做| 国产区视频在线| 精品视频一二三| av一级在线| 欧美精品日韩少妇| 最近免费中文字幕大全免费第三页 | 国产传媒在线播放| 国产成人精品自线拍| 一本大道香蕉8中文在线视频| 亚洲一本大道| 国产中文字幕在线| 亚洲国产精华液| 人成在线免费视频| 国产资源在线看| 国产亚av手机在线观看| 国产二区视频| 亚洲网站视频在线观看| 91在线超碰| 超碰国产在线观看| 136福利第一导航国产在线| 国产黄色在线观看| 欧美日韩**字幕一区| 国产视频97| 国产对白国语对白| 国产永久免费高清在线观看| 国产色在线播放| 亚洲天堂久久久| 最新av中文字幕| 国产黄色免费网站| 国产a级网站| 国产乱人视频免费播放| 超碰97在线免费观看| 精品视频二区| 国产精品视频一区二区久久| 1区2区视频| 日韩精品免费一区二区| 中文字幕不卡免费视频| 免费99热在线观看| 尤物在线精品视频| 69国产精品视频| 在线免费看黄av| 69久久久久| 97一区二区三区| 国产日韩精品在线看| 天堂中文字幕在线| www在线播放| 国产人成网在线播放va免费| 国产在线拍揄自揄拍视频| 女同一区二区免费aⅴ| а√资源新版在线天堂| 国产丝袜视频在线播放| 中文天堂av| 在线中文字幕视频观看| 精品精品导航|