亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

XML 數據的編碼方式

2019-11-18 21:10:11
字體:
來源:轉載
供稿:網友
Chris Lovett
Microsoft Corporation
2000 年 3 月

目錄

1、跨平臺數據格式
2、xml 和字符編碼
3、字符集和 MSXML DOM
4、用 MSXML 創建新的 XML 文檔
5、結論
6、有關詳細信息


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

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

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

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

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

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

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

關于字符編碼
標準文本格式是建立在標準字符集之上的。要記住,所有的計算機均將文本存儲為數字。然而,不同的系統也可以用不同的數字存儲相同的文本。下表顯示了一組字節是如何被存儲的,第一個是使用默認代碼頁 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 訂購單的發貨欄中輸入瑞典家中的地址時,她相信 Internet 會正確地傳遞字符 &aring;(在其 Macintosh 上的字節值是 140),并沒想到接收和處理她發送消息的計算機會將字節值 140 轉換為字母 &#338;。

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

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

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

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

Content-Type 標題
因為更舊的單字節字符集仍被使用,所以只有當指定了數據所在的實際字符集之后,傳輸數據的問題才能得以解決。認識到這一點后,Internet 電子郵件和 HTTP 協議小組定義了一種標準方法,用以在消息標題 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

該標題向應用程序表明,跟在標題后面的內容位于 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 頁中,字節值 229 表示 &aring;?,F在該頁對任何系統來說,都是完全清楚的,數據不會被曲解。遺憾的是,由于此元標記是可選的,所以它給錯誤留下了空子。

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

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

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

如果文件以 Unicode 字節次序標志 [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(帶字節次序標志的 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
現在,討論過不同的字符編碼方法之后,讓我們來看看如何在 MSXML DOM 中加載 XML 文檔,以及當碰到模糊編碼的字符時,可能收到的出錯消息的類型。加載 XML DOM 文檔的兩個主要方法是 LoadXML 方法和 Load 方法。

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

Load 方法可將以下內容當作 VARIANT:

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


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

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


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


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


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

在文本內容中發現了一個無效字符。

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

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

不支持從當前編碼轉換到指定的編碼。

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

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

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

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


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

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

下列 UTF-8 編碼文件的結果是:

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

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

盡管這看上去有點怪,但卻是正確的。下列測試裝載了用 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 方法使用的編碼,需要用如下位于文檔頂部的編碼屬性創建 XML 聲明:

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

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

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

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

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

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

有關詳細信息
Microsoft MSDN Online Library: XML DOM Reference(Microsoft MSDN 聯機庫: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 聯機庫:與混合環境的兼容性問題)



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美激情一级欧美精品| 日韩一区视频在线| 久久久久久噜噜噜久久久精品| 中文字幕精品在线| 国语自产偷拍精品视频偷| 国产成人综合av| 国产精品日日做人人爱| 色偷偷av一区二区三区乱| 国产欧美亚洲精品| 国产午夜精品久久久| 欧美精品久久久久| 亚洲精品国精品久久99热一| xxxx性欧美| 亚洲一区二区三区乱码aⅴ| 中文字幕欧美精品日韩中文字幕| 国产精品青青在线观看爽香蕉| 亚洲国产日韩一区| 亚洲午夜久久久影院| 日韩激情av在线免费观看| 亚洲成avwww人| 日韩av在线网页| 欧美理论在线观看| 日韩欧美在线字幕| 欧美日韩另类在线| 欧美成人一区二区三区电影| 久久99久久99精品免观看粉嫩| 久久影视电视剧免费网站清宫辞电视| 日韩av电影中文字幕| 日韩中文在线不卡| 亚洲电影免费观看高清完整版| 青草热久免费精品视频| 亚洲天堂开心观看| 91精品国产精品| 亚洲性日韩精品一区二区| 51ⅴ精品国产91久久久久久| 中文字幕无线精品亚洲乱码一区| 92看片淫黄大片欧美看国产片| 国产精品午夜国产小视频| 欧美午夜性色大片在线观看| 久久久久久久电影一区| 国产乱肥老妇国产一区二| 久久久久久久久久久免费| 日韩一区二区三区在线播放| 国产精品一区=区| 久久人人爽亚洲精品天堂| 欧美色欧美亚洲高清在线视频| 欧美日本中文字幕| 超碰精品一区二区三区乱码| xvideos亚洲| 久久久久久久久久久网站| 一区二区三区在线播放欧美| 国产日韩精品在线| 国产精品亚洲综合天堂夜夜| 亚洲专区中文字幕| 一区二区三区精品99久久| 国产一区红桃视频| 亚洲精品一区久久久久久| 91精品国产高清自在线看超| 欧美大片欧美激情性色a∨久久| 91精品综合视频| 欧美日韩一区二区在线播放| 中文字幕日韩免费视频| 尤物精品国产第一福利三区| 久久视频这里只有精品| 91av视频在线免费观看| 最近中文字幕mv在线一区二区三区四区| 97视频免费看| 国产精品爽爽爽爽爽爽在线观看| 国产精品入口夜色视频大尺度| 日韩亚洲欧美中文高清在线| 久99久在线视频| 亚洲女同精品视频| 久久97久久97精品免视看| 久久久久一本一区二区青青蜜月| 亚洲欧洲日产国产网站| 亚洲男人av电影| 日韩av最新在线| 国产视频欧美视频| 精品激情国产视频| 国产精品主播视频| 57pao成人国产永久免费| 亚洲欧美自拍一区| 国产在线观看精品一区二区三区| 成人福利在线视频| 欧美日韩一区二区免费在线观看| 亚洲欧美日韩精品| 亚洲美女黄色片| 精品一区二区亚洲| 欧美丰满老妇厨房牲生活| 中文字幕av一区| 亚洲韩国欧洲国产日产av| 欧美电影免费观看高清| 欧美激情第99页| 精品久久香蕉国产线看观看亚洲| 91美女片黄在线观| 久久不射电影网| 久久久久久久国产| 亚洲免费一在线| 亚洲影视九九影院在线观看| 成人性生交大片免费看视频直播| 在线免费观看羞羞视频一区二区| 欧美俄罗斯性视频| 中文字幕一精品亚洲无线一区| 国产精品久久久久一区二区| 国内精品国产三级国产在线专| 国产国产精品人在线视| 欧美午夜精品久久久久久人妖| 欧洲成人性视频| 国产精品91久久久久久| 日韩视频一区在线| 欧美性20hd另类| 97精品国产97久久久久久春色| 国产精品福利无圣光在线一区| 日韩av影视综合网| 欧美激情精品久久久久久大尺度| 日韩视频精品在线| 中日韩美女免费视频网站在线观看| 国产精品成人播放| 91九色综合久久| 91精品国产乱码久久久久久蜜臀| 国产精品久久久久久网站| 亚洲免费视频网站| 亚洲综合最新在线| 国产日本欧美一区二区三区| 亚洲日本成人女熟在线观看| 日韩美女激情视频| 亚州精品天堂中文字幕| 亚洲精品自产拍| 91高清免费在线观看| 成人性生交大片免费观看嘿嘿视频| 一区二区在线视频播放| 97在线看福利| 亚洲高清久久久久久| 色哟哟网站入口亚洲精品| 98精品国产自产在线观看| 欧美国产亚洲精品久久久8v| 国产视频999| 日韩av片永久免费网站| 国产精品r级在线| 国产成人亚洲综合青青| 日韩av在线免费观看一区| 成人午夜激情网| 88国产精品欧美一区二区三区| 色阁综合伊人av| 亚洲欧美在线第一页| 亚洲第一福利在线观看| 色综合视频一区中文字幕| 亚洲美女性视频| 中文字幕精品www乱入免费视频| 亚洲国产免费av| 国外色69视频在线观看| 欧美另类极品videosbestfree| 欧美激情视频一区二区| 国产精品自拍小视频| 欧美性极品xxxx娇小| 欧美精品制服第一页| 国产精品美女www爽爽爽视频| 欧美色视频日本版| 久久久国产精品一区| 日韩午夜在线视频| 国模叶桐国产精品一区| 91精品国产色综合久久不卡98口| 日韩免费电影在线观看| 亚洲图片制服诱惑|