中文编码

 

中文编码问题的原理与解决方案
2009-06-10 13:28

基本概念
字符:字符是数据,字母,汉字,标点符号,图形符号等各种文件和符号的总称。
字符集:字符集是各种字符的集合,通常有某些组织命名。如ASCII字符集,Unicode字符集,ISO-8859-1字符集,GB2312字符集,GBK字符集等。
汉字编码:计算机只能处理数字,计算机存储和处理汉字是通过赋予每个汉字一个特殊的数字来实现的。这个数据就是汉字编码。汉字编码是指在计算机存储文字是,计算机内存储的对应表示形式。
GB2312:GB2312又叫GB2312-80,全称为《信息交换用汉字编码字符集基本集》是1980年发布的处理中文信息的国家标准,是中国国家标准的简体中文字符集。GB2312包括6763个简体中文汉字,还有一些数组,字母,图形符号等共7445个字符,GB2312能够满足大多数的用户的汉字处理要求,但是他只支持简体中文,不支持繁体中文。GB2312是双字节编码。

GBK:GBK是对GB2312的扩展,兼容GB2312,支持繁体中文,GBK是一种重要的编码形式,中文版windows98,windows2000均采用GBK编码形式存储文件

unicode:Unicode为每个字符提供了唯一的编码,此处每个字符指得是任何平台(windows,Linux等)任何语言(任何语言,英语,汉语,法语等),Unicode几乎被所有的操作系统和浏览器支持。
UTF-8编码:UTF-8是Unicode Translation Format的缩写,是一种把Unicode进行编码的方式,UTF-8使用可变长度字节存储Unicode字符。
Java中文件的编码采用Unicode编码方式,java编译器在编译原文件时,先读取源文件的编码方式,例如windows采用GBK编码方式,所以编译器将Java源代码转换为Unicode格式的源代码文件,然后编译成Unicode编码的class文件,最后存储在文件系统中。
如图
JSP/Servlet编码方式
1.用户通过浏览器A,想服务器请求JSP页面index.jsp,服务器上Tomcat容器B接受请求并分析请求字符串,得到请求的index.jsp文件和收入参数。
2.Tomcat调用JSP引擎,JSP引擎查看被请求的index.jsp页面中编码方式。
3.然后按照JSP页面指定的编码方式转译成.java文件。如果JSP页面没有指定编码方式,则使用Tomcat所在机器上的操作系统的默认编码方式翻译为.java文件。如果windows2000中默认的编码方式翻译为index.jsp文件。
4.JSP引擎调用Java编译器
5.Java编译器以GB2312编码读入index_jsp.java文件,在内存中转化为Unicode编码。
6.把转换为Unicode编码的类文件index_jsp.java进行编译,编译形成的Class文件为index_jsp.class
7.Java虚拟机(JVM)读入index_jsp.class文件,在内存中使用Unicode进行编码,然后运行编码后的index_jsp.class文件。
8.如果客户端在第一步中请求index.jsp页面时带有参数,并且JSP没有指定就收参数时的编码方式,Tomcat会采用默认的ISO-8859-1编码对传入的参数进行编码。如果指定了编码方式,如GB2312则会采用指定的方式进行编码。然后编码后的输入参数在JVM内存中转化为Unicode编码,并作为第七步的运行中的参数。
9.JVM将运行后的结果按照index.jsp中的输出编码指示(已经在JVM内存中了)进行编码,并输出到浏览器上,如果没有指定输出的编码格式,将按照ISO-8859-1默认编码输出到浏览器上。
10如果调用index.jsp中有调用数据库的代码,JVM会调用Hiberante,然后Hiberante把数据传给SQL,SQL在接受数据时采用指定的编码方式接受传递过来的数据,然后使用指定的编码方式存储和检索数据。随后Hibernate将数据传递给JVM然后在传递给客户端。
从以上的步骤可以看出,Java的核心是Unicode,在编译运行时内部采用Unicode编码,但是在程序输入和输出的接口上采用的是用户指定的编码形式
。可以看出解决中文问题的关键是在Java编译时的输入以及Java运行时的输入输出时指定正确的编码形式。
解决方案
JSP页面
<%@ page pageEncoding="GBK"%>指定请求时编码方式为GBK
<%@ page content="text/html;charset=GBK"%>指定响应时编码方式为GBK
Servlet解决中文问题
request.setCharacterEncoding("GBK");//指定请求时编码方式
response.setContentType("text/html;charset=GBK");//指定响应时编码方式
过滤器使用--中文问题处理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值