盡管可以使用多種方法對(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í)際上,在一種特定情況下,可能只有一種選擇。
注重: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ī)率并可以提高效率。
/* 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
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
// 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);
支持多種編碼方式 需要支持多種編碼方式的應(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)(即編碼聲明)。