`
sslaowan
  • 浏览: 380344 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

UTF-8 字符处理在 Web 开发中的应用

阅读更多

http://www.ibm.com/developerworks/cn/web/wa-lo-utf8/index.html?ca=drs

殷 健, 软件工程师,IBM CSDL

 

2006 年 7 月 27 日

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) Accept: 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") 来设定输出字符集,浏览器将不能正确的解码和显示输出。

分享到:
评论

相关推荐

    UTF-8字符处理在Web开发中的应用

    ### UTF-8字符处理在Web开发中的应用 #### 引言 随着互联网的全球化发展,Web应用必须具备处理多语言的能力,以满足不同国家和地区用户的使用需求。这不仅涉及到用户界面的多语言支持,还包括数据的多语言输入、...

    utf-8 中文字符表

    - 双字节的UTF-8字符:第一位是10,其余位用来编码Unicode码点的低7位,范围大致对应0x80-0x7FF。 - 三字节的UTF-8字符:前两位是110,中间三位用来编码Unicode码点的低11位,范围大致对应0x800-0xFFFF。 - 四字节的...

    快速转码(UTF-8转ASCII)

    在上述代码中,我们首先获取了UTF-8和ASCII的`Charset`对象,然后创建了一个UTF-8编码器,并将UTF-8字符串编码为字节数组。由于ASCII只能表示128个字符,所以在转换过程中可能会遇到无法表示的字符,这时我们需要...

    winForm中进行Utf-8 及 GB2312转换

    string utf8Str = "你的Utf-8字符串"; byte[] utf8Bytes = Encoding.UTF8.GetBytes(utf8Str); string gb2312Str = Encoding.GetEncoding("GB2312").GetString(utf8Bytes); ``` 2. **解码转换**:相反,如果你有一个...

    ASP 生成静态网页(UTF-8)

    在涉及到UTF-8编码时,我们确保生成的静态网页能够正确显示多种语言的字符,特别是非英文字符,如中文、日文、韩文等。 在ASP中生成静态网页的过程主要包括以下步骤: 1. **动态数据获取**:首先,ASP脚本需要获取...

    delphi操作utf-8转码HTTPEncode

    总结,要在Delphi中完成“UTF-8转码HTTPEncode”的操作,你需要先将UTF-8字符串转换为Unicode字符串,然后使用`UrlEncode`函数进行HTTPEncode编码。这个过程对于处理HTTP请求中的参数或URL路径非常重要,可以避免...

    zh-cn-utf8

    UTF-8是目前最广泛使用的多语言字符编码标准,特别是在Web开发和编程领域。 描述中的“unicode(utf8)”提到了Unicode和UTF-8的关系。Unicode是一个庞大的字符集,包含了世界上几乎所有的文字和符号,旨在统一各种...

    如何将编码转换为UTF-8

    1. UTF-8 编码的重要性:在 WEB 开发中,UTF-8 编码扮演着非常重要的角色,特别是在传递中文时,必须经过编码的动作,否则可能会出现乱码的情况。 2. 使用 URLEncoder.encode() 方法:在 Java 中,可以使用 java...

    百度编辑器asp版UTF-8编码

    在ASP项目中使用UTF-8编码,可以确保在处理多语言内容时避免乱码问题,特别是对于包含大量中文字符的网页。 4. **自测修改** 描述中的“通过本人亲自己测试修改”表明这个版本的百度编辑器ASP版UTF-8编码可能已经...

    utf-8解码小程序

    在Web开发中,UTF-8是最常用的字符编码之一,因为它可以高效地存储和传输多语言文本。 ### 2. URL编码与解码 URL编码(也称为百分比编码)是将特殊字符转换为一种可以在URL中安全传输的形式的过程。具体而言,URL...

    UTF-8工具,用过不错

    在处理不同编码格式的文件时,如需将GBK(GB2312)编码的文件转换为UTF-8,或者反之,就需要借助专门的转换工具。"UTF-8工具"很可能就是这样一款软件,它可以批量处理文件编码的转换工作,提高工作效率。批量转换...

    设置myeclipse新建jsp文件默认编码为UTF-8

    本文将详细介绍如何设置MyEclipse新建JSP文件的默认编码为UTF-8,以确保在项目中正确处理中文字符。 #### 二、MyEclipse简介 MyEclipse是一款功能强大的Java Web集成开发环境(IDE),它基于Eclipse平台并提供了...

    Java 程序转码(UTF-8)

    其中,UTF-8是一种变长字符编码,用于Unicode编码标准,兼容ASCII,并且能够高效地存储大多数非英文字符。 ##### 2. UTF-8编码特点 - **兼容性**:UTF-8编码与ASCII完全兼容。 - **可扩展性**:随着新字符的添加,...

    PHPCMS-formguide_export_utf-8-导出EXCEL表格功能

    "utf-8"则代表字符编码,确保在处理多语言或者包含特殊字符的数据时,能正确无误地显示和保存。"导出EXCEL表格"是指系统提供了将这些数据导出为Microsoft Excel格式的功能,便于进一步的数据分析、报表制作或与其他...

    Web开发关于UTF-8的问题总结.docx

    在Web开发中,UTF-8编码是一个至关重要的概念,它是一种广泛使用的字符编码标准,能够支持全球大部分语言的字符表示。以下是对Web开发中遇到的UTF-8问题的详细总结: 1. HTML页面转UTF-8编码问题: - 在HTML文件的...

    (支持UTF-8)---- jspSmartUpload.jar

    "jspSmartUpload.jar"是一个专为Java Web开发设计的库,用于处理文件上传任务,尤其强调对UTF-8字符集的支持。这个库在处理多语种环境下的文件上传时,能确保文件名和元数据的正确编码,避免了因字符集问题导致的...

    中文转UTF-8编码

    其中,UTF-8(Unicode Transformation Format-8 bits)作为最常用的多字节编码格式,在Web开发及文本处理中占据着核心地位。本文将围绕“中文转UTF-8编码”这一主题,详细解析中文字符如何转换为UTF-8编码,并通过一...

    CString转UTF8,UTF8转CString

    - 如果输入的UTF-8字符串包含非法字符,可能会导致转换失败或不正确的结果。 #### 四、总结 通过上述两个函数,我们可以实现`CString`与UTF-8编码字符串之间的相互转换。这对于处理国际化文本或与Web服务交互时...

    SmartUpload文件上传UTF-8源码版,无乱码

    针对这个问题,"SmartUpload文件上传UTF-8源码版"应运而生,它解决了原版SmartUpload在处理UTF-8编码文件名时可能出现的乱码问题。 SmartUpload是由Jark Widerström开发的Java库,它为Web应用程序提供了一种简单的...

    utf-8与unicode

    它支持世界上几乎所有的字符,并且具有向后兼容ASCII的特点,即所有ASCII码字符在UTF-8中的编码与原ASCII码相同。这种特性使得UTF-8成为了Web和电子邮件等通信协议中最常见的文本编码方式。 - **特点:** - 向后...

Global site tag (gtag.js) - Google Analytics