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

首頁 > 開發 > XML > 正文

選擇和識別 XML 字符編碼的方式

2024-07-21 02:35:30
字體:
來源:轉載
供稿:網友

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

  注重:Oracle XDK for C/C++ 提供一種非凡的模式,答應以任意的單字節字符編碼方式來創建 DOM 樹,而 API 以指定編碼方式工作。此特性用于優化目的,被看作是例外情況,因為其目的是用于那些已了解數據包含指定字符集中字符的情況。強烈建議您始終使用 xmlinitenc 初始化函數或將 data_encoding 屬性指定給 XML 上下文。
  使用規定編碼方式是一種最佳應用,因為您不必關注文檔內或文檔本身的編碼信息 — 用戶始終了解編碼方式。因此減少了出錯機率并可以提高效率。
  
  但是即使規定了編碼方式,XML 處理器也可能不“了解”它 — 在這種情況下,應用程序必須確保使用規定的編碼方式。例如,假如 Java 應用程序有一個 DOM 樹必須串行化為 UTF-8 [RFC-3629] 格式的輸出流,則在將輸出從 Writer 轉換到 OutputStream 時,通過明確指定 UTF-8 可以確保該過程的執行。以下偽代碼是在 Java Servlet 中指定輸出編碼方式的一個示例:
  
  /* 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 格式,則您的應用程序應該編寫為只接受 UTF-8 格式的輸入。例如,在 Java 語言中,您可能需要使用構造符創建 InputSource 對象,該構造符使用一個參數來指定輸入編碼方式。此外,您可以從輸入流中創建 InputStreamReader,指定 UTF-8 作為輸入編碼方式。以下偽代碼說明如何在 Java 語言中指定輸入編碼方式。
  
  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
  
  常用編程環境的大部分字符串數據類型都將字符編碼方式限定在特定的范圍中。即使提供多種選擇,通常也會有某些約束。例如,標準庫和 Oracle 庫必須支持用于 C/C++ 中 char 類型的字符編碼方式。使用 FORCE_INCODING 標志或 input_encoding 屬性來指定規定的或外部指定的輸入編碼方式。以下偽代碼演示了如何為 C 的 XDK 指定規定編碼方式。
  
  // 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);
  
  選擇規定字符編碼方式
  假如應用程序不需要支持多種編碼方式,它可以為其本身規定唯一的編碼方式。
假如規定了一種編碼方式,則這種方式應該是 UTF-8 或 UTF-16 [RFC-2781] — 否則交互操作性將受到嚴重影響,因為使用文檔的 XML 處理器可以不支持其他編碼方式。假如需要與 US-ASCII [RFC-20] 兼容,或者需要以串行化格式進行傳輸或存儲,則建議使用 UTF-8。在其他情況下,可能適于使用 UTF-16。
  
  支持多種編碼方式
  需要支持多種編碼方式的應用程序能夠支持 XML 處理器所支持的任何編碼方式。所有的 XML 處理器都支持 UTF-8 和 UTF-16。它們通常也支持一些常用的本地編碼方式。
  
  雖然 Oracle XML 處理器支持所有常用編碼方式以及許多其他編碼方式,但建議僅在必要時答應多種編碼方式。應用程序不應該包含那些不使用 UTF-8 或 UTF-16 編碼方式的 XML 文檔,除非知道用戶支持該編碼方式并且其內容可以使用編碼方式表達。例如,假如數據庫字符集不是 Unicode,則不贊成在數據庫中包含 XML 文檔并在數據庫字符集中利用它為未知用戶提供服務。
  
  為接收各種編碼方式的輸入實體,應該由 XML 處理器以字節流的形式不加更改地讀取輸入流。確保將外部提供的編碼信息(例如內容類型的 HTTP 標題中的 charset 參數)傳遞到 XML 處理器,以便在 XML 處理器分析輸入時強制為指定的編碼方式。這種情況就象指定的編碼方式就是規定編碼方式一樣。
  
  為了以任意編碼方式生成輸出,需要確保實體帶有字符編碼信息,其方法是通過外部標記實現,如 HTTP 標題的 charset 參數以及 Oracle Files 或 Oracle XML DB 等信息庫中的字符集屬性,或者是通過嵌入標記實現(即編碼聲明)。
  
  外部標記優先于內部標記,因為外部標記更可靠并更易于處理;盡可能不使用內部標記是明智的選擇。實際上,先前曾討論過,因為通常不了解編碼方式,所以一般不需要內部標記。
  
  經常由于所需的字符集轉換而使聲明的編碼方式與實際編碼方式不一致。例如,假如您將帶有編碼聲明信息的文檔插入 CLOB 類型的數據庫列中,或通過 Java 字符流來讀取它時,其聲明不會神奇地轉變為實際的值。通過使用 NLS_LANG 設置和 Java 字符數據類型等更高級協議來維護正確的編碼方式時,很輕易避免這種情況。(Oracle 的 XMLType 數據類型可滿足處理多種字符編碼方式的預期情況。)
  
  外部與內部編碼信息的對比
  字符編碼信息的來源可以分為兩類:外部或內部。本章討論二者之間的重要差別。
  
  外部編碼信息
  圖 1 描述了分析器如何根據一種外部編碼信息源 — HTTP 的內容類型標題 — 確定字符編碼方式。注重,這里沒有使用內部編碼信息。
  
 選擇和識別 XML 字符編碼的方式(圖二)

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

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美国产欧美亚洲国产日韩mv天天看完整| 庆余年2免费日韩剧观看大牛| 国模私拍一区二区三区| 亚洲aⅴ男人的天堂在线观看| 在线亚洲男人天堂| 亚洲成人网久久久| 欧美性猛交xxxxx水多| 亚洲国产欧美一区二区丝袜黑人| 欧美精品videos另类日本| 国产一区二区成人| 久久久久久久亚洲精品| 欧美激情视频在线观看| 欧美华人在线视频| 成人www视频在线观看| 一本色道久久88综合亚洲精品ⅰ| 456亚洲影院| 中文字幕一区二区三区电影| 亚洲天堂av在线播放| 国内偷自视频区视频综合| 久久久久亚洲精品国产| 国产精品h片在线播放| 国产一区二区久久精品| 2018日韩中文字幕| 亚洲社区在线观看| 亚洲精品自在久久| 日韩美女免费线视频| 中文字幕精品—区二区| 成人免费网站在线| 国产婷婷色综合av蜜臀av| 97av在线播放| 欧美日韩亚洲视频一区| 欧美性极品少妇精品网站| 国产91热爆ts人妖在线| 欧美精品videossex性护士| 不卡伊人av在线播放| 最近2019中文免费高清视频观看www99| 日韩av在线免费播放| 久久偷看各类女兵18女厕嘘嘘| 亚洲免费视频一区二区| 91精品免费久久久久久久久| 国产自摸综合网| 亚洲国产97在线精品一区| 国产精品无码专区在线观看| 亚洲精品乱码久久久久久金桔影视| 精品亚洲永久免费精品| 欧美日韩免费网站| 中文字幕无线精品亚洲乱码一区| xxxxx91麻豆| 在线播放国产一区中文字幕剧情欧美| 久久精品国产久精国产一老狼| 清纯唯美亚洲激情| 久久国产精品99国产精| 91青草视频久久| 色哟哟入口国产精品| 久久久久久久久久国产精品| 亚洲国产精品99久久| 国产精品视频最多的网站| 亚洲精品小视频在线观看| www.久久久久久.com| 日韩av在线影视| 97久久超碰福利国产精品…| 亚洲欧洲日韩国产| 亚洲自拍欧美色图| 91精品91久久久久久| 欧美激情va永久在线播放| 人妖精品videosex性欧美| 成人在线播放av| 国模精品系列视频| 欧美激情一区二区三区在线视频观看| 欧美丝袜第一区| 日韩在线小视频| 欧美成人在线网站| 亚洲国产欧美一区二区丝袜黑人| 91中文在线观看| 亚洲日本欧美中文幕| 亚洲国产精品高清久久久| 国产精品久久久久久久av电影| 青青a在线精品免费观看| 日韩欧美亚洲一二三区| 国产精品久久久久久久久粉嫩av| 国模精品一区二区三区色天香| 福利视频第一区| 黄色成人av在线| 国产一区二区三区四区福利| 97国产精品人人爽人人做| 久久精品在线播放| 91国产视频在线播放| 亚洲成人性视频| 国模精品视频一区二区| 中文字幕av一区| 97国产成人精品视频| 国产精品色视频| 欧美日韩国产成人在线| 中国china体内裑精亚洲片| 97超级碰在线看视频免费在线看| 91日韩在线播放| 国产欧美最新羞羞视频在线观看| 国产精自产拍久久久久久蜜| 欧美电影免费观看高清| 欧美色视频日本高清在线观看| 日韩av中文字幕在线免费观看| 国产精品高潮呻吟视频| 国产精品露脸自拍| 亚洲色无码播放| 亚洲美女视频网站| 精品欧美国产一区二区三区| 成人免费在线视频网址| 日本国产高清不卡| 久久久免费精品视频| 热久久这里只有| 色七七影院综合| 亚洲级视频在线观看免费1级| 激情成人中文字幕| 国产欧美精品在线| 欧美色图在线视频| 日本精品视频在线| 高清欧美电影在线| 欧美裸体xxxx极品少妇| 精品久久久久久久久久| 国产精品igao视频| 亚洲国产精品99| 中文在线资源观看视频网站免费不卡| 国产精品久久久av| 国产欧美va欧美va香蕉在线| 97视频在线免费观看| 亚洲国产精品va在线观看黑人| 秋霞午夜一区二区| 九九热这里只有在线精品视| 91色中文字幕| 国产欧美日韩最新| 在线a欧美视频| 亚洲天堂av综合网| 亚洲精品免费一区二区三区| 亚洲人成电影网| 国产精品免费久久久| 欧美寡妇偷汉性猛交| 97免费视频在线播放| 国产精品久久久久99| 国产精品视频999| 日韩av在线资源| 国内精品久久久久影院 日本资源| 三级精品视频久久久久| 亚洲网站在线观看| 亚洲第一精品电影| 亚洲精品美女视频| 日韩欧美一区二区三区久久| 在线免费观看羞羞视频一区二区| 中文字幕日韩av综合精品| 欧美性xxxxx| 欧美人与性动交a欧美精品| 亚洲人成电影在线| 一区二区三区无码高清视频| 亚洲精品资源在线| 欧美激情久久久久| 国产精品美女在线观看| 亚洲最新在线视频| 国内自拍欧美激情| 亚洲亚裔videos黑人hd| 亚洲精品电影网| 成人写真视频福利网| 国产精品久久久久久久久久| 色婷婷久久av| 亚洲一区制服诱惑| 午夜精品视频在线|