- 论坛徽章:
- 0
|
关于UTF-8编码
2006-11-28 19:03
我一直在想,不知道有哪个国家像中国一样,拥有“简体”“繁体”两种字体!“简体中文”有其笔画简洁易于书写的好处,“繁体中文”有其蕴义丰富,方形饱满的美感,都各有千秋!可是一个国家两种字体真让人哭笑不得,大陆地区全部用改革后的中文字“简体中文”,而港、澳、台地区却保留使用未简化的中文,称之为繁体中文。当然,形成这种尴尬的局面有其政治历史的原因,以至于中国的文字无法统一,总的来说我比较喜欢繁体中文。喜欢它的饱满和方形的美感!
文字的不统一,对于一个国家的网络经济发展造成很不好的影响的。网络,你以最快的速度吸引最多的浏览者,积累流量,迅速占领市场,你才能成功。如果网页的文字系统只提供给能阅读简体中文的用户,而忽略了那一部份使用繁体中文的用户那是不明智的。怎么更好的解决这个方法?唯一的途径是做两个语言版本的网站,一个简体中文版,提供给使用简体中文系统的用户;另一个是繁体中文版,提供给使用繁体系统的用户。由于文字的不统一,要制作两种不同的编码方式的网站满足不同使用者,这样子即提高的网站的开发运营成本,又不利于网站整体数据的整合。
简体中文使用的编码方式是“GB2312”,繁体中文使用的编码方式是“BIG5”!疯了,同样是中文搞两种不同的编码方式,如果没有相应的字符集,查看网页内容的时候就会变成乱码。真是又可恨又可笑。如果涉及到数据库,那么繁体的资料入到简体数据库里面变成乱码,反之,简体资料录到繁体数据库也变成乱码。很不利于数据的整合!
如果能用有统一的编码方式,能让简繁体的用户查看中文网站的时候不需要安装语言包,不会出现乱码,可以轻松地浏览网页内容,那即解决了用户的困扰也相应地降低了网站开发成本。以下为大家介绍一种好的编码方式“UTF-8”。“UTF-8”很好地解决以上的问题。一起来了解UTF-8:
UTF-8 字符处理在 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 请求消息的示例:
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 提供了浏览器的首选字符集,服务器端程序能够根据客户端的要求来生成需要的响应。用户可以通过配置浏览器来设置首选语言。
当浏览器发出请求后,可以通过以下代码来读取客户端浏览器的首选语言和国家代码
[code]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());
服务器端的输出结果为:
[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 响应
当服务器端收到请求后,会处理请求并发回应答。服务器通过应答消息的头部来指明诸如服务器软件和相应的内容类型等信息。以下是一个应答消息头的示例:
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 GMTContent-type 表明了应答消息的 MIME 类型和应答消息体的字符集,浏览器会用相应的字符集来显示消息内容。例如,在以上示例中字符集是 UTF-8,浏览器会用 UTF-8 编码来解析和现实返回的消息体。同时页面输入也会被用 UTF-8 编码。
Web 页面显示编码
可以通过以下几种方式来设置内容类型。
在 HTML 中设置页面的编码方式
如果被访问的是一个静态的 HTML 页面。可以通过以下方式来设置页面的编码方式。
设置页面编码的静态 HTML 文件
example.html
标记"" 将应答消息头中 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 中设置页面的编码格式。
设置业面编码的 JSP 页面指令
在这行的页面指令中的"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 页面:
用以界面输入的 JSP 页面
insertdb.jsp
Name:
页面指令元素的属性 Content-type 值为"text/html; charset=UTF-8",这会向浏览器指明页面是按照 UTF-8 编码的,并且所有用户通过页面的输入也会按照 UTF-8 编码。被 Action 所触发的 Servlet 如下例所示。
用以按 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("");
out.println("The input is " + test1);
out.println("");
在被触发的 Servlet 中通过设置 resp.setContentType("text/html;charset=UTF-8") 来向浏览器指明输出的编码字符集为 UTF-8,浏览器会用正确的字符集来显示输出。如果 Servlet 中没有显示的调用 resp.setContentType("text/html;charset=UTF-8") 来设定输出字符集,浏览器将不能正确的解码和显示输出。
结论
本文给出了一些在 Web 应用开发中如何显示和输入 UTF-8 编码字符的方法。便于读者在开发实践中参考。
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/35985/showart_400633.html |
|