在jsp开发过程中会遇到各种中文乱码问题

发布时间:2012-12-28 19:53:18   来源:文档文库   
字号:

jsp开发过程中会遇到各种中文乱码问题,对乱码的处理方法也有所不同!究其原因.大部分是因为编码默认采用ISO-8859-1或者是编码不一致导致的,悲剧的是默认的ISO-8859-1编码不支持中文!(,中国...感慨一下,不解释)所幸,UTF-8,GBK,GB2312都是支持中文的!

     1.    jsp页面中文乱码    这种乱码最常见也最好解决  page指令中添加页面内容和显示方式的设置,如下两种都可以:

<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>

<%@ page language="java" import="java.util.*" ContentType="text/html;charset=gb2312"%>

          有人会问pageEncodingContentType有什么区别,简单说

         contentType指定的是JSP页最终 Browser(客户端)所见到的网页内容的编码 

         pageEncoding指定JSP编写时所用的编码

2. 表单提交中文乱码 当用Request对象获取客户提交的汉字代码的时候,会出现乱码 

Method=”POST”

接收数据的文件中要加入<% request.setCharacterEncoding("gb2312");%>

3. 中文作为参数传递乱码

new String(userName.getBytes("ISO-8859-1"), "gb2312")这句代码是转换编码格式的关键,这种转码方式还可以用在读取数据库中文乱码的转码!但要是原来的字符编码不是ISO-8859-1时这个方法就会失效,出错!

try{
   byte[] tempByte = gbStr.getBytes("GB2312");
   uniStr = new String(tempByte,"ISO8859_1");
     }catch(Exception ex){
    }

你也可以在直接的转换,首先你将获取的字符串用ISO-8859-1进行编码,然后将这个编码存放到一个字节数组中,然后将这个数组转化成字符串对象就可以了,例如:


String str=request.getParameter(“字符串”);
Byte B[]=str.getBytes(“ISO-8859-1”);
Str=new String(B);

4. 读取cookie时出现乱码

写入cookie时先编码

Cookie nameCookie = new Cookie("name", java.net.URLEncoder.encode(strname,"GB2312"));

读取cookie时再解码

String name=java.net.URLDecoder.decode(name,"GB2312")

或者采用树上第136页的方法

写入cookie时先编码,将汉字编码转换为Unicode编码,解决汉字乱码问题

读取cookie时再解码Unicode编码转换为汉字编码,解决汉字乱码问题

2. 编码基本知识 

最早的编码是iso8859-1,和ascii编码相似。但为了方便表示各种各样的语言,逐渐出现了很多标准编码,重要的有如下几个。 

2.1. iso8859-1 

属于单字节编码,最多能表示的字符范围是0-255,应用于英文系列。比如,字母'a'的编码为0x61=97 

很明显,iso8859-1编码表示的字符范围很窄,无法表示中文字符。但是,由于是单字节编码,和计算机最基础的表示单位一致,所以很多时候,仍旧使用iso8859-1编码来表示。而且在很多协议上,默认使用该编码。比如,虽然"中文"两个字不存在iso8859-1编码,以gb2312编码为例,应该是"d6d0 cec4"两个字符,使用iso8859-1编码的时候则将它拆开为4个字节来表示:"d6 d0 ce c4"(事实上,在进行存储的时候,也是以字节为单位处理的)。而如果是UTF编码,则是6个字节"e4 b8 ad e6 96 87"。很明显,这种表示方法还需要以另一种编码为基础。 

2.2. GB2312/GBK 

这就是汉子的国标码,专门用来表示汉字,是双字节编码,而英文字母和iso8859-1一致(兼容iso8859-1编码)。其中gbk编码能够用来同时表示繁体字和简体字,而gb2312只能表示简体字,gbk是兼容gb2312编码的。 

2.3. unicode 

这是最统一的编码,可以用来表示所有语言的字符,而且是定长双字节(也有四字节的)编码,包括英文字母在内。所以可以说它是不兼容iso8859-1编码的,也不兼容任何编码。不过,相对于iso8859-1编码来说,uniocode编码只是在前面增加了一个0字节,比如字母'a'"00 61" 

需要说明的是,定长编码便于计算机处理(注意GB2312/GBK不是定长编码),而unicode又可以用来表示所有字符,所以在很多软件内部是使用unicode编码来处理的,比如java 

2.4. UTF 

考虑到unicode编码不兼容iso8859-1编码,而且容易占用更多的空间:因为对于英文字母,unicode也需要两个字节来表示。所以unicode不便于传输和存储。因此而产生了utf编码,utf编码兼容iso8859-1编码,同时也可以用来表示所有语言的字符,不过,utf编码是不定长编码,每一个字符的长度从1-6个字节不等。另外,utf编码自带简单的校验功能。一般来讲,英文字母都是用一个字节表示,而汉字使用三个字节。 

注意,虽然说utf是为了使用更少的空间而使用的,但那只是相对于unicode编码来说,如果已经知道是汉字,则使用GB2312/GBK无疑是最节省的。不过另一方面,值得说明的是,虽然utf编码对汉字使用3个字节,但即使对于汉字网页,utf编码也会比unicode编码节省,因为网页中包含了很多的英文字符。 

本文来源:https://www.2haoxitong.net/k/doc/7a3c9f26453610661ed9f422.html

《在jsp开发过程中会遇到各种中文乱码问题.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式