UTF-8 字符處理在 Web 開發中的應用

發表于:2007-05-24來源:作者:點擊數: 標簽:web開發UTF-8字符中的
Web 應用要適應多語言的 需求 。不同國家的用戶應該可以輸入本國語言的字符, 同時 Web 應用又應該可以根據不同的區域設置來用多國語言顯示頁面。 當前,不同的語言有不同的編碼方式來顯示對應的語言信息,例如中文可以用 GB2312 編碼來顯示,日文可以用 Shift
Web 應用要適應多語言的需求。不同國家的用戶應該可以輸入本國語言的字符, 同時 Web 應用又應該可以根據不同的區域設置來用多國語言顯示頁面。 當前,不同的語言有不同的編碼方式來顯示對應的語言信息,例如中文可以用 GB2312 編碼來顯示,日文可以用 Shift-JIS 編碼來顯示。但 UTF-8 編碼方式幾乎可以包括了所有的語言字符。用 UTF-8 編碼來處理 Web 應用信息的輸入和顯示可以使不同 Web 應用之間的信息交互標準化,并且可以簡化應用的開發過程。

UTF-8 編碼介紹

UTF-8 編碼是一種被廣泛應用的編碼,這種編碼致力于把全球的語言納入一個統一的編碼,目前已經將幾種亞洲語言納入。UTF 代表 UCS Transformation Format.

UTF-8 采用變長度字節來表示字符,理論上最多可以到 6 個字節長度。UTF-8 編碼兼容了 ASC II(0-127), 也就是說 UTF-8 對于 ASC II 字符的編碼是和 ASC II 一樣的。對于超過一個字節長度的字符,才用以下編碼規范:

左邊第一個字節1的個數表示這個字符編碼字節的位數,例如兩位字節字符編碼樣式為為:110xxxxx 10xxxxxx; 三位字節字符的編碼樣式為:1110xxxx 10xxxxxx 10xxxxxx.;以此類推,六位字節字符的編碼樣式為:1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx。 xxx 的值由字符編碼的二進制表示的位填入。只用最短的那個足夠表達一個字符編碼的多字節串。例如:

Unicode 字符: 00 A9(版權符號) = 1010 1001, UTF-8 編碼為:11000010 10101001 = 0x C2 0xA9; 字符 22 60 (不等于符號) = 0010 0010 0110 0000, UTF-8 編碼為:11100010 10001001 10100000 = 0xE2 0x89 0xA0





回頁首


HTTP 通訊協議

HTTP 請求

在 HTTP 通訊中,在客戶端發出的請求報文中,首先設置的是方法。方法是用來告訴服務器客戶端發起的動作請求。在請求的報文頭部,客戶端還可以同時發送附加的信息,比如客戶端使用的瀏覽器和客戶端可以解釋的內容類型等。這些信息可以被服務器端應用程序使用以生成響應。下面是一個 HTTP 請求消息的示例:


圖1. HTTP 請求消息頭
GET /intro.html HTTP/1.0
            User-Agent: Mozilla/4.0 (compatible; MSIE 4.0; Windows 95)
            Aclearcase/" target="_blank" >ccept: image/gif, image/jpeg, text/*, */*
            Accept-language : zh
            Accept-Charset: iso-8859-1
            

這個請求通過 GET 方法來獲取資源 /intro.htm。User-Agent 提供了客戶端瀏覽器的信息,同時 Accept 提供了客戶端可以接受的媒體類型。Accep-language 指出了客戶端瀏覽器的首選語言, Accept-Charset 提供了瀏覽器的首選字符集,服務器端程序能夠根據客戶端的要求來生成需要的響應。用戶可以通過配置瀏覽器來設置首選語言。以 IE 為示例如下:


圖2. 瀏覽器首選語言設置
圖2. 瀏覽器首選語言設置

當瀏覽器發出請求后,可以通過以下代碼來讀取客戶端瀏覽器的首選語言和國家代碼。


圖3. 服務器端 Servlet 讀取瀏覽器首選國家和語言
protected void insertproc(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException{
            Locale reqLocal = req.getLocale();
            System.out.println("The country is :" + reqLocal.getCountry());
            System.out.println("The language is :" + reqLocal.getLanguage());
            

服務器端的輸出結果為:


圖4. 服務器端 Servlet 讀取瀏覽器首選國家和語言結果
[06-3-10 14:56:32:516 CST] 6ce078f9 SystemOut     O The country is :CN
            [06-3-10 14:56:32:516 CST] 6ce078f9 SystemOut     O The language is :zh
            

HTTP 響應

當服務器端收到請求后,會處理請求并發回應答。服務器通過應答消息的頭部來指明諸如服務器軟件和相應的內容類型等信息。以下是一個應答消息頭的示例:


圖5.HTTP 應答消息頭
Date: Saturday, 23-May-98 03:25:12 GMT
            Server: JavaWebServer/1.1.1
            MIME-version: 1.0
            Content-type: text/html; charset=UTF-8
            Content-length: 1029
            Last-modified: Thursday, 7-May-98 12:15:35 GMT
            

Content-type 表明了應答消息的 MIME 類型和應答消息體的字符集,瀏覽器會用相應的字符集來顯示消息內容。例如,在以上示例中字符集是 UTF-8,瀏覽器會用 UTF-8 編碼來解析和現實返回的消息體。同時頁面輸入也會被用 UTF-8 編碼。





回頁首


Web 頁面顯示編碼

可以通過以下幾種方式來設置內容類型。

在 HTML 中設置頁面的編碼方式

如果被訪問的是一個靜態的 HTML 頁面??梢酝ㄟ^以下方式來設置頁面的編碼方式。


圖6. 設置頁面編碼的靜態 HTML 文件
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
            <HTML>
            <HEAD>
            <META http-equiv="Content-Type" content="text/html; charset=UTF-8">
            <TITLE>example.html</TITLE>
            </HEAD>
            <BODY>
            </BODY>
            </HTML>
            

標記"<META http-equiv="Content-Type" content="text/html; charset=UTF-8">" 將應答消息頭中 Content_type 設置為"text/html; charset=UTF-8".

在 Servlet 中設置頁面顯示編碼方式

在 Servlet 中,我們可以通過以下方式來設置應答消息的內容類型。


圖7.設置頁面編碼的 Servlet 片斷
protected void insertproc(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException{
            resp.setContentType("text/html;charset=UTF-8");
            

代碼行"resp.setContentType("text/html;charset=UTF-8");"將應答消息頭中 Content_type 設置為"text/html; charset=UTF-8"。

在 JSP 中設置頁面顯示編碼方式

我們通過以下示例說明如何在 JSP 中設置頁面的編碼格式。


圖8. 設置業面編碼的 JSP 頁面指令
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
            

在這行的頁面指令中的"text/html; charset=UTF-8"將應答消息中的"Content-type" 設置為"text/html; charset=UTF-8"。

"pageEncoding"只是指明了 JSP 頁面本身的編碼格式,指明了 JSP 是以什么編碼方式保存。容器在讀取文件時將起轉化為內部使用的 Unicode. 當應答發送回至瀏覽器時,容器會將內部使用的 Unicode 轉化為在 Content-type 中指定的字符集。

如果沒有指定 PageEncoding,可以通過使用 Content-type 指定的字符集來解釋 JSP 頁面字節。

為了能正常顯示 UTF-8 編碼的字符,要滿足以下兩個條件:

1. 通知瀏覽器應答消息使用的字符集。

2. 配置瀏覽器使其能有正常顯示 UTF-8 編碼的字體。





回頁首


Web 頁面輸入編碼

HTML 的表單可以接受非西歐語言字符的輸入。當需要創建一個需要接受非西歐語言字符輸入的表單時,必須通知瀏覽器應該為用戶輸入使用哪個字符集,我們可以通過設置 page 指令的 contentType 屬性來設置。

我們需要注意的是,當表單被提交后,瀏覽器會將表單字段值轉換為指定字符集對應的字節值,然后根據 HTTP 標準 URL 編碼方案對結果字節進行編碼。當使用 ISO-8859-1 編碼時,任何 a 到 z, A 到 Z 和 0 到 9 之外的字符都會被轉化為十六進制格式的字節值,并在前面加上一個百分號(%).例如,如果表單的字符集被設為 UTF-8, 字符"中文"被傳遞的編碼格式為:"%E4%B8%AD%E6%96%87"。為了對輸入的信息進行處理,容器必須知道瀏覽器是使用什么字符集對輸入進行編碼的。問題是當今多數的瀏覽器并不提供這種信息,因此你必須自己提供這種信息,并告訴容器用哪個字符集對輸入進行解碼。

頁面輸入編碼設定

在本文第3部分中說明了如何設置頁面的顯示編碼,在設置頁面編碼的同時,也就指定了頁面的輸入方式。如果頁面的顯示被設置為UTF-8,那么用戶所有的頁面輸入都會按照 UTF-8 編碼。

頁面輸入輸出過程編碼設置

服務器端程序在讀取表單輸入之前要設定輸入編碼。我們可以看一下示例。

以下是一個用來提示用戶輸入的 JSP 頁面:


圖9. 用以界面輸入的 JSP 頁面
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
            <HTML>
            <HEAD>
            <TITLE>insertdb.jsp</TITLE>
            </HEAD>
            <BODY>
            <P>
            <FORM METHOD=POST ACTION="./InsertDbProcDs">
            <TABLE>
            <TR>
            <TD>Name:</TD>
            <TD><input type="text" name="col2" value=""></TD>
            <TR>
            <TD><INPUT type="submit" value="submit"></TD>
            </TR>
            </TR>
            </TABLE>
            </RORM>
            </P>
            </BODY>
            </HTML>
            

頁面指令元素的屬性 Content-type 值為"text/html; charset=UTF-8",這會向瀏覽器指明頁面是按照 UTF-8 編碼的,并且所有用戶通過頁面的輸入也會按照 UTF-8 編碼。被 Action 所觸發的 Servlet 如下例所示。


圖10. 用以按 UTF-8 讀取輸入并輸出的 Servlet
    protected void insertproc(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException{
            String test1 = req.getParameter("col2");
            PrintWriter out = resp.getWriter();
            resp.setContentType("text/html;charset=UTF-8");
            out.println("<HTML>");
            out.println("The input is " + test1);
            out.println("</HTML>");
            

通過表單頁面輸入"中文"并提交表單,得到的結果為:


圖11.正確顯示結果的頁面
圖11.正確顯示結果的頁面

如果我們注釋掉語句:resp.setContentType("text/html;charset=UTF-8"), 如下例:


圖12. 用以按非 UTF-8 讀取輸入并輸出的 Servlet
protected void insertproc(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException{
            String test1 = req.getParameter("col2");
            PrintWriter out = resp.getWriter();
            //resp.setContentType("text/html;charset=UTF-8")
            out.println("<HTML>");
            out.println("The input is " + test1);
            out.println("</HTML>");
            

輸入"中文"并提交表單,得到的結果為:


圖13. 錯誤顯示輸入結果的頁面
圖13. 錯誤顯示輸入結果的頁面

頁面不能正確顯示 UTF-8 編碼的字符。

在被觸發的 Servlet 中通過設置 resp.setContentType("text/html;charset=UTF-8") 來向瀏覽器指明輸出的編碼字符集為 UTF-8,瀏覽器會用正確的字符集來顯示輸出。如果 Servlet 中沒有顯示的調用 resp.setContentType("text/html;charset=UTF-8") 來設定輸出字符集,瀏覽器將不能正確的解碼和顯示輸出。





回頁首


結論

本文給出了一些在 Web 應用開發中如何顯示和輸入 UTF-8 編碼字符的方法。便于讀者在開發實踐中參考。

原文轉自:http://www.anti-gravitydesign.com

評論列表(網友評論僅供網友表達個人看法,并不表明本站同意其觀點或證實其描述)
国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97