麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > 開(kāi)發(fā) > XML > 正文

選擇和識(shí)別 XML 字符編碼的方式

2024-07-21 02:35:30
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

  在存儲(chǔ)、傳輸或處理文本時(shí),有必要了解字符編碼方式。這種規(guī)則也適用于 xml,因?yàn)?XML 是基于文本的。
  
  盡管可以使用多種方法對(duì) XML 進(jìn)行編碼,卻并沒(méi)有關(guān)于使用哪種編碼方式以及如何進(jìn)行識(shí)別的準(zhǔn)則。因此,本技術(shù)說(shuō)明闡述了將字符編碼方式應(yīng)用到 XML 的最佳應(yīng)用。
  
  選擇 XML 實(shí)體的字符編碼方式
  在選擇所使用的字符編碼方式時(shí),必須首先了解可以選擇哪些方式。在涉及到標(biāo)準(zhǔn)規(guī)范和執(zhí)行環(huán)境的那些特定 XML 應(yīng)用程序的情況下,可能將編碼方式限定在某個(gè)范圍內(nèi)。實(shí)際上,在一種特定情況下,可能只有一種選擇。
  
  術(shù)語(yǔ)“規(guī)定編碼方式”是指在這種情況下必須使用的編碼方式。例如,編程環(huán)境的字符串?dāng)?shù)據(jù)類型可能必須包含在預(yù)定的編碼方式中,如 java 字符中的 UTF-16 或 SQL 字符數(shù)據(jù)類型中的數(shù)據(jù)庫(kù)字符集。唯一的編碼方式經(jīng)常以不同的方法進(jìn)行規(guī)定。表 1 顯示了這類情況的一些其他示例。
  
  表 1. 規(guī)定唯一編碼方式的示例
  
 選擇和識(shí)別 XML 字符編碼的方式(圖一)

  注重:Oracle XDK for C/C++ 提供一種非凡的模式,答應(yīng)以任意的單字節(jié)字符編碼方式來(lái)創(chuàng)建 DOM 樹(shù),而 API 以指定編碼方式工作。此特性用于優(yōu)化目的,被看作是例外情況,因?yàn)槠淠康氖怯糜谀切┮蚜私鈹?shù)據(jù)包含指定字符集中字符的情況。強(qiáng)烈建議您始終使用 xmlinitenc 初始化函數(shù)或?qū)?data_encoding 屬性指定給 XML 上下文。
  使用規(guī)定編碼方式是一種最佳應(yīng)用,因?yàn)槟槐仃P(guān)注文檔內(nèi)或文檔本身的編碼信息 — 用戶始終了解編碼方式。因此減少了出錯(cuò)機(jī)率并可以提高效率。
  
  但是即使規(guī)定了編碼方式,XML 處理器也可能不“了解”它 — 在這種情況下,應(yīng)用程序必須確保使用規(guī)定的編碼方式。例如,假如 Java 應(yīng)用程序有一個(gè) DOM 樹(shù)必須串行化為 UTF-8 [RFC-3629] 格式的輸出流,則在將輸出從 Writer 轉(zhuǎn)換到 OutputStream 時(shí),通過(guò)明確指定 UTF-8 可以確保該過(guò)程的執(zhí)行。以下偽代碼是在 Java Servlet 中指定輸出編碼方式的一個(gè)示例:
  
  /* response is an http servlet response object */
  response.setCharacterEncoding("UTF-8"); // set the output encoding to UTF-8
  PRintWriter w = response.getWriter(); // get the output stream mandated to UTF-8
  :
  /* doc is an instance of an XML */
  doc.print(w);              // the document printed in the specified encoding
  
  同樣,假如您的輸入必須是 UTF-8 格式,則您的應(yīng)用程序應(yīng)該編寫(xiě)為只接受 UTF-8 格式的輸入。例如,在 Java 語(yǔ)言中,您可能需要使用構(gòu)造符創(chuàng)建 InputSource 對(duì)象,該構(gòu)造符使用一個(gè)參數(shù)來(lái)指定輸入編碼方式。此外,您可以從輸入流中創(chuàng)建 InputStreamReader,指定 UTF-8 作為輸入編碼方式。以下偽代碼說(shuō)明如何在 Java 語(yǔ)言中指定輸入編碼方式。
  
  InputSource is = new InputSource();    // create an input source
  is.setByteStream(request.getInputStream()); // set the input stream mandated to UTF-8
  is.setEncoding("UTF-8");          // set the mandate encoding to the input source
  parser.parse(is);              // the parser will parse in the specified encoding
  
  常用編程環(huán)境的大部分字符串?dāng)?shù)據(jù)類型都將字符編碼方式限定在特定的范圍中。即使提供多種選擇,通常也會(huì)有某些約束。例如,標(biāo)準(zhǔn)庫(kù)和 Oracle 庫(kù)必須支持用于 C/C++ 中 char 類型的字符編碼方式。使用 FORCE_INCODING 標(biāo)志或 input_encoding 屬性來(lái)指定規(guī)定的或外部指定的輸入編碼方式。以下偽代碼演示了如何為 C 的 XDK 指定規(guī)定編碼方式。
  
  // parse an input stream in UTF-8 with DOM
  XmlLoadDom(ctx, &err, "stream", in, "input_encoding", "UTF-8", NULL);
  // parse an input stream in UTF-8 with SAX
  XmlLoadSax(ctx, &err, "stream", in, "input_encoding", "UTF-8", NULL);
  // print the document in UTF-8
  XmlSaveDom(ctx, &err, doc, "stream", out, "output_encoding", "UTF-8", NULL);
  
  選擇規(guī)定字符編碼方式
  假如應(yīng)用程序不需要支持多種編碼方式,它可以為其本身規(guī)定唯一的編碼方式。
假如規(guī)定了一種編碼方式,則這種方式應(yīng)該是 UTF-8 或 UTF-16 [RFC-2781] — 否則交互操作性將受到嚴(yán)重影響,因?yàn)槭褂梦臋n的 XML 處理器可以不支持其他編碼方式。假如需要與 US-ASCII [RFC-20] 兼容,或者需要以串行化格式進(jìn)行傳輸或存儲(chǔ),則建議使用 UTF-8。在其他情況下,可能適于使用 UTF-16。
  
  支持多種編碼方式
  需要支持多種編碼方式的應(yīng)用程序能夠支持 XML 處理器所支持的任何編碼方式。所有的 XML 處理器都支持 UTF-8 和 UTF-16。它們通常也支持一些常用的本地編碼方式。
  
  雖然 Oracle XML 處理器支持所有常用編碼方式以及許多其他編碼方式,但建議僅在必要時(shí)答應(yīng)多種編碼方式。應(yīng)用程序不應(yīng)該包含那些不使用 UTF-8 或 UTF-16 編碼方式的 XML 文檔,除非知道用戶支持該編碼方式并且其內(nèi)容可以使用編碼方式表達(dá)。例如,假如數(shù)據(jù)庫(kù)字符集不是 Unicode,則不贊成在數(shù)據(jù)庫(kù)中包含 XML 文檔并在數(shù)據(jù)庫(kù)字符集中利用它為未知用戶提供服務(wù)。
  
  為接收各種編碼方式的輸入實(shí)體,應(yīng)該由 XML 處理器以字節(jié)流的形式不加更改地讀取輸入流。確保將外部提供的編碼信息(例如內(nèi)容類型的 HTTP 標(biāo)題中的 charset 參數(shù))傳遞到 XML 處理器,以便在 XML 處理器分析輸入時(shí)強(qiáng)制為指定的編碼方式。這種情況就象指定的編碼方式就是規(guī)定編碼方式一樣。
  
  為了以任意編碼方式生成輸出,需要確保實(shí)體帶有字符編碼信息,其方法是通過(guò)外部標(biāo)記實(shí)現(xiàn),如 HTTP 標(biāo)題的 charset 參數(shù)以及 Oracle Files 或 Oracle XML DB 等信息庫(kù)中的字符集屬性,或者是通過(guò)嵌入標(biāo)記實(shí)現(xiàn)(即編碼聲明)。
  
  外部標(biāo)記優(yōu)先于內(nèi)部標(biāo)記,因?yàn)橥獠繕?biāo)記更可靠并更易于處理;盡可能不使用內(nèi)部標(biāo)記是明智的選擇。實(shí)際上,先前曾討論過(guò),因?yàn)橥ǔ2涣私饩幋a方式,所以一般不需要內(nèi)部標(biāo)記。
  
  經(jīng)常由于所需的字符集轉(zhuǎn)換而使聲明的編碼方式與實(shí)際編碼方式不一致。例如,假如您將帶有編碼聲明信息的文檔插入 CLOB 類型的數(shù)據(jù)庫(kù)列中,或通過(guò) Java 字符流來(lái)讀取它時(shí),其聲明不會(huì)神奇地轉(zhuǎn)變?yōu)閷?shí)際的值。通過(guò)使用 NLS_LANG 設(shè)置和 Java 字符數(shù)據(jù)類型等更高級(jí)協(xié)議來(lái)維護(hù)正確的編碼方式時(shí),很輕易避免這種情況。(Oracle 的 XMLType 數(shù)據(jù)類型可滿足處理多種字符編碼方式的預(yù)期情況。)
  
  外部與內(nèi)部編碼信息的對(duì)比
  字符編碼信息的來(lái)源可以分為兩類:外部或內(nèi)部。本章討論二者之間的重要差別。
  
  外部編碼信息
  圖 1 描述了分析器如何根據(jù)一種外部編碼信息源 — HTTP 的內(nèi)容類型標(biāo)題 — 確定字符編碼方式。注重,這里沒(méi)有使用內(nèi)部編碼信息。
  
 選擇和識(shí)別 XML 字符編碼的方式(圖二)

  當(dāng)輸入是以 HTTP 或者任何可以從外部識(shí)別其編碼方式的其他形式傳入時(shí),應(yīng)用程序應(yīng)該完成以下工作中的一項(xiàng):
  
  將 charset 參數(shù)的值傳遞給分析器
  根據(jù) charset 參數(shù)將輸入流轉(zhuǎn)換為 Unicode
  指示分析器來(lái)分析 URI
  使用復(fù)合編碼方式需要的數(shù)據(jù)類型
  
  內(nèi)部編碼信息
  圖 2 顯示了分析器如何通過(guò)自動(dòng)檢測(cè)來(lái)確定字符編碼方式。注重,文檔必須具有正確的字節(jié)順序標(biāo)記 (BOM) 和/或編碼聲明。
  
 選擇和識(shí)別 XML 字符編碼的方式(圖三)

  在沒(méi)有提供外部編碼信息的情況下,可以使用自動(dòng)檢測(cè)。例如:
  
  XML 作為文件存儲(chǔ)在文件系統(tǒng)中。
  發(fā)送方?jīng)]有提供外部編碼信息,并且沒(méi)有規(guī)定編碼方式。
  
  內(nèi)部字符編碼信息來(lái)源的具體信息
  
  我們已經(jīng)討論了將會(huì)使用何種編碼方式以及如何在運(yùn)行時(shí)指定、傳輸和確定這種方式,就讓我們來(lái)探討字節(jié)順序標(biāo)記和編碼聲明,這些是自動(dòng)檢測(cè)字符編碼方式的工具。
  
  字節(jié)順序標(biāo)記 (BOM)
  BOM(Unicode 字符 U+FEFF、ZERO WIDTH NO-BREAK SPACE)可以出現(xiàn)在 XML 實(shí)體的開(kāi)始部分。在 XML 中,BOM 不僅用于顯示輸入文本流的字節(jié)順序,而且可以幫助檢測(cè)字符編碼方式。XML 處理器通常檢查輸入流的前幾個(gè)字節(jié),以判定編碼方式是否為 UTF-16 或 ASCII,因此 XML 處理器能夠讀取可能在 XML 標(biāo)題中提供的編碼聲明。UTF-16 格式的實(shí)體需要具有供自動(dòng)檢測(cè)使用的 BOM,因?yàn)?UTF-16 編碼方式具有兩種形式:UTF-16BE(big endian:fe ff)和 UTF-16LE(little endian:ff fe)。雖然沒(méi)有字節(jié)順序問(wèn)題,但 UTF-8 格式的實(shí)體可以具有 BOM (ef bb bf)。BOM 不是文檔的一部分,因此不能從用戶代碼中讀取。通常 XML 處理器在必要時(shí)添加或刪除 BOM。
  
  編碼聲明
  編碼聲明是 XML 標(biāo)題的參數(shù)之一(非凡稱為 XML 或文本聲明)。例如
  
  引入編碼聲明是為了在缺少外部字符編碼信息的情況下進(jìn)行分析時(shí),為那些不使用 UTF-8 或 UTF-16 編碼方式的實(shí)體提供字符編碼信息。一種常見(jiàn)的誤解認(rèn)為,假如 XML 實(shí)體正在使用的不是 UTF-8 或 UTF-16 的編碼方式,則它必須具有編碼聲明。實(shí)際上,假如知道編碼方式,則編碼聲明沒(méi)有用處,這經(jīng)常是問(wèn)題之所在。XML 分析器提供了一種指定每個(gè)輸入實(shí)體字符編碼方式的方法。假如分析器知道實(shí)體的編碼方式,則聲明中的值并不重要。假如以傳遞給分析器的參數(shù)形式從外部提供了編碼信息,則通常忽略該值。在其他情況

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 亚洲一级毛片 | 国产乱淫av片免费观看 | 国产午夜精品久久久 | 中文字幕www | 成人在线视频国产 | 成人在线视频免费 | 亚洲精品久久久久久久久久久 | 久久资源总站 | 日韩午夜一区二区三区 | 国产色视频在线观看免费 | 娇喘在线 | 成年性羞羞视频免费观看 | av电影免费在线看 | av免费在线观看av | 欧美日韩高清在线观看 | 国产精品久久久久久久模特 | 久久久成人一区二区免费影院 | 久久精品视频69 | 毛片视频网站在线观看 | 国产一级一级片 | 干少妇av | cosplay裸体福利写真 | 污片视频在线观看 | 国产精品久久久免费 | 国产精品久久久久久久四虎电影 | av国产免费| 久久亚洲国产精品 | 亚洲码无人客一区二区三区 | 久草手机在线 | 亚洲网站在线观看 | 亚洲国产精品久久久久久久久 | 欧美国产二区 | 国产一区二区二 | 亚洲第一页中文字幕 | 国产精品久久亚洲 | 免费在线观看毛片视频 | 黄色免费小网站 | 国产色视频免费 | 亚洲精中文字幕二区三区 | 久久国产精品二国产精品 | 久久久久91视频 |