JSP中文乱码问题的解决
JSP技术中文乱码的原因及解决方法
万方数据《电子设计工程》2011年第1期转换的规律。
3)缩程所用的软件工具的字符编码开发JSP文件时,1)iS08859一l编码通常叫做htin一1,属于单字节编码.最多能表示的字符范围是0~255.应用于英文系列。
IS08859一l编码表示的字符范围很窄,无法表示中文字符。
但是.由于是单字节编码,和计算机最基础的表示单位一致,所以很多时候,仍IH使用IS08859一l编码来表示。
而且在很多协议上.默认使用该编码。
2)GB2312/GBK编码这就是汉字的国标码,专门用来表示汉字.是双字节编码其中GBK编码能够用来同时表示繁体字和简体字,而GB2312只能表示简体字,GBK是兼容GB2312编码的。
3)Unicode编码这是最统一的编码,可以用来表示所有语言的字符,而且是定长双字节(也有四字节的)编码,包括英文字母在内。
但是它是不兼容IS08859一l编码的,也不兼容任何编码。
4)UTF一8编码UTF一8编码兼容IS08859一l编码.兼容Unicode编码。
兼容同时也可以用来表示所有语言的字符.不过。
UTF-8编码是不定长编码,每一个字符的长度从l~6个字节不等。
另外,UTF一8编码自带简单的校验功能。
一般来讲。
英文字母都是用一个字节表示,而汉字使用3个字节。
从以上的所述13I可以知道。
当网贞上仅有英文字符时。
可以选用IS08859一l编码。
网贞141上一旦有汉字时,字符的编码必须为GB2312/GBK编码.Unicode编码或UrⅡ、_8编码。
特别值得一提的是。
UTF一8编码还与其他编码兼容。
使用这种编码.就不会出现乱码。
2影响JSP文件中字符编码的外部因素在JSP动态网页开发过程中.所谓的影响JSP文件巾字符编码的外部因素,是指运行其他软件的最低层软件——操作系统。
建立JSP文件时所用的软件,以及显示JSP文件的工具对汉字编码的影响151。
具体地说就是操作系统、测览器、编程所用的软件T具。
每个软件都有自己默认支持的字符编码。
JSP中乱码问题
1.中文乱码问题,首先得需要确定的是,数据库的默认编码要
设置正确,一般设为gb2312.
2.JSP中文乱码问题之一:调用JSP页面显示乱码
通过浏览器调用JSP页面,在客户端浏览器中所有的中文内容出现乱码。
解决方案:
首先确认本JSP在编辑器中保存时,使用的是GB2312(或GBK)的编码格式,然后在JSP页面的开始部分添加
<%@ pageEncoding=”GBK”%>就可以解决中文乱码问题。
3.JSP中文乱码问题之二:调用Servlet页面显示乱码
调用Servlet,Servlet在浏览器中显示内容出现乱码
解决方案:
在Servlet使用response在输出内容之前,先执行response.setContentType(”text/html; chatset=GBK”),设定输出内容编码为GBK,注意的是这句话放在方法的第一行。
4.JSP中文乱码问题之三:post表单传递参数乱码
通过JSP页面、HTML页面或者Servlet中的表单元素提交参数给对应的JSP页面或者Servlet而JSP页面或者Servlet接收的中文参数值乱码
解决方案:
在接收post提交的参数之前,使用request.setCharacterEncoding(“GBK”),设定接收参数的内容使
用GBK编码。
遇到jsp中文显示乱码的解决方案
不用编码就可以插入了
2.显示插入的中文:
因为存入的是latin,所以显示的时候就要GBK一下
String x=new String((rs.getString("title")).getBytes("ISO8859_1"),"GBK");
</head>
<body>
<%=request.getParameter("name")%>
</body>
</html>
如果submit.jsp提交英文字符能正确显示,如果提交中文时就会出现乱码。原因:浏览器默认使用UTF-8编码方式来发送请求,而UTF-8和GB2312编码方式表示字符时不一样,这样就出现了不能识别字符。解决办法:通过request.seCharacterEncoding("gb2312")对请求进行统一编码,就实现了中文的正常显示。修改后的process.jsp代码如下:
iso = iso.trim();
gb = new String(iso.getBytes("ISO-8859-1"),"GB2312");
return gb;
}
}
catch(Exception e)
{
System.err.print("编码转换错误:"+e.getMessage());
綠起:
JSP的request 默认为ISO8859_1,所以在处理中文的时候,要显示中文的话,必须转成GBK的,如下String str=new String(request.getParameter("name").getBytes("ISO8859-1"),"GBK"); out.println(str); 这样就可以显示中文了
如何处理JSP开发容易出现的中文乱码问题
在java编程中,经常会碰到汉字的处理及显示问题,一不小心就会产生一大堆乱码或问号,这也是让许多初学者手足无措的讨厌问题。
造成这种问题的根本原因是java中默认的编码方式是Unicode,而中国人通常使用的文件和DB都是基于GB2312或者big5等编码,固会出现此问题。
对于中文问题,不同的jdk版本,不同的应用服务器,处理方法都会有一些微小的差异。
在这里,主要针对Tomcat中JSP开发容易出现的中文乱码问题进行讨论,当然,大多数解决方法是通用的。
一般有以下几种情况:1、JSP输出中文的乱码问题所谓在JSP输出中文,即直接在JSP中输出中文,或者给变量赋中文值再输出等,这种情况下的乱码问题往往是因为没有给JSP页面制定显示字符的编码方式,解决方法如下:(1)在JSP页面头部加上语句<% @ page contentType=”text/html;charset=utf-8”%>(在servlet 中使用httpServletResponse.setContentType(“text/html; charset=utf-8”)),最好同时在JSP页面的head部分加上<meta http-equiv=”Content-Type”content=”text/html;charset=utf-8”>。
(2)在每次要输出中文的地方主动转换编码方式,比如要在页面中输入“中文”二字,就可以用以下方法:<%String str = “中文”;Byte[] tmpbyte = str.getBytes(“ISO8859_1”);str = new String(tmpbyte);out.print(str);2、获取表单提交的数据时的中文乱码问题在没有加任何其他处理之前,用request.getParameter(“paramName”)获取表单提交中的数据,且表单数据中含有中文时,返回的字符串会呈现乱码。
JSP中文乱码问题解决方案
JSP中文乱码问题解决方案中文乱码就是因为编码不符,可能出现乱码有四个地方:1 JSP编码乱码2 HTML编码乱码3 request获取数据乱码4 response输出信息乱码5 Cookie导致的编码问题下面将会对上面几种情况进行介绍:1 JSP乱码这种是最常见的,设置编码的位置位于JSP的第一行,如果在Eclipse中新建一个JSP默认是下面这种:<%@ page language="java"contentType="text/html; charset=ISO-8859-1"pageE ncoding="ISO-8859-1"%>可以看到它默认的页面编码和传输编码都是ISO-8859-1,这是用于欧洲国家的编码。
可以通过设置Eclipse中JSP的编码格式,来修改默认生成的编码格式。
如果想要支持中文,可以使用UTF-8、GB2312、GBK等,其中UTF-8是国际化的,哪个国家的都支持,所以推荐使用这个。
再来说说上面涉及到编码的两个地方:charset 和pageEncodingcharset是指服务器发往客户端展现时的编码;pageEncoding用于设置JSP页面本身的编码。
JSP在部署后提供给用户使用,会经过三个阶段:(1)JSP生成java文件:这个阶段会使用pageEncoding所定义的编码格式进行转换(2)java文件生成class文件:这个阶段由服务器tomcat自动使用utf -8编码把java文件转换成字节码class文件(3)通过读取class文件展现给用户:这个阶段由tomcat服务器获取字节码内容,通过使用contentType所定义的编码格式展现给用户。
大致过程如下图:这样设置好JSP中的第一行代码,就可以保证基本的JSP展现没有乱码了!<%@ page language="java"contentType="text/html; charset=UTF-8"pageEncodi ng="UTF-8"%>2 HTML乱码因为JSP中也包含html的内容,HTML本身也是有编码格式的。
jsp中文乱码问题[jsp中文页面乱码与传参乱码]
页面乱码这种乱码的原因是应为没有在页面里指定使用的字符集编码,解决方法:只要在页面开始地方用下面代码指定字符集编码即可代码如下数据库乱码这种乱码会使你插入数据库的中文变成乱码,或者读出显示时也是乱码,解决方法如下:在数据库连接字符串中加入编码字符集代码如下 String Url="jdbc:myql://localhot/digitgulfuer=root&paword=root&ueUnicode=true&characterEncoding=GB2312";并在页面中使用如下代码:代码如下 repone.etContentType("te某t/html;charet=gb2312"); requet.etCharacterEncoding("gb2312");URL传值乱码方法一:1. 在b.jp中把pageEncoding="GB2312"改为pageEncoding="ISO8859-1"虽然这样b.jp页面显示的内容还是乱码,但是不是那种“ ”的乱码,而是一些特殊字符2. 然后在浏览器中查看菜单中修改成GB2312的编码,这时乱码就显示中文了。
3. 但是这种方法是不可行的。
方法二:1. 在b.jp中把代码如下 String name=requet.getParameter("name");修改为代码如下 String name=new String(requet.getParameter("name").getByte("ISO-8859-1"),"GB2312");2. 这时再在页面上显示,则就是中文了。
方法三:在请求页面的请求参数需要用encodeURI进行转码,然后在接收请求的页面需要进行字符集转换。
JSP的中文乱码问题
JSP中文乱码问题有如下几个方面:页面乱码、参数乱码、表单乱码、源文件乱码。
下面来逐一解决其中的乱码问题。
一、JSP页面中文乱码在JSP页面中,中文显示乱码有两种情况:一种是HTML中的中文乱码,另一种是在JSP中动态输出的中文乱码。
先看一个JSP程序:[java]view plaincopyprint?1.<%@ page language="java"import="java.util.*" %>2.<html>3. <head>4. <title>中文显示示例</title>5.6. </head>7. <body>8.这是一个中文显示示例:9. <%10. String str = "中文";11. out.print(str);12. %>13. </body>14.</html>上面这个JSP程序看起来好像是在页面显示几句中文而且标题也是中文。
运行后在浏览器中显示如图所示原因在于没有在JSP中指定页面显示的编码,消除乱码的解决方案很简单上面代1.<%@ page language="java"import="java.util.*" contentType="text/html;charset=GB2312" %>再次运行乱码消失,原理就是向页面指定编码为GB2312,那么页面就会按照此编码来显示,于是乱码消失。
二、URL传递参数中文乱码一般情况下在使用get方法提交表单的时候传递的参数如果是中文的话很可能会出现乱码。
下面是一个示例程序[java]view plaincopyprint?1.<%@ page language="java"import="java.util.*" contentType="text/html; charset=gb2312"%>2.<html>3. <head>4. <title>URL传递参数中文处理示例</title>5. </head>6. <%7. String param = request.getParameter("param");8. %>9. <body>10. <a href="URLCharset.jsp?param='中文'">请点击这个链接</a><br>11.你提交的参数为:<%=param%>12. </body>13.</html>上面这个JSP程序的功能就是通过一个URL链接向自身传递一个参数,这个参数是中文字符串,这个程序的运行效果如下图对于URL传递中文参数乱码这个问题,其处理方法比较特殊,仅仅转换这个中文字符串或者设置JSP页面显示编码都是不能解决问题的,需要修改Tomcat服务器的配置文件才能解决问题。
jsp页面显示中文乱码解决
jsp页面显示中文乱码:jsp页面的编码方式有两个地方需要设置:<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><%@ page contentType="text/html;charset=utf-8"%>其中:pageEncoding 指的是jsp文件本身在本地保存时的编码方式。
contentType的charset 是指服务器发送网页内容给客户端时所使用的编码。
从第一次访问一个jsp页面开始,到这个页面被发送到客户端,这个Jsp页面要经过三次编码转换:第一阶段是jsp编译成.java,它会根据pageEncoding的设定读取jsp,结果是由指定的编码方案翻译成统一的UTF-8 JAVA源码(即.java),如果pageEncoding设定错了,或没有设定,出来的就是中文乱码。
第二阶段是由JAVAC的JAVA源码至java byteCode的编译,不论JSP编写时候用的是什么编码方案,经过这个阶段的结果全部是UTF-8的encoding的java源码。
JAVAC用UTF-8的encoding读取java源码,编译成UTF-8 encoding的二进制码(即.class),这是JVM对常数字串在二进制码(java encoding)内表达的规范。
第三阶段是Tomcat(或其的application container)载入和执行阶段二的来的JAVA二进制码,输出的结果,也就是在客户端见到的,这时隐藏在阶段一和阶段二的参数contentType就发挥了功效所以最终的解决方法为:在jsp页面设置pageEncoding或者contentType的其中一个为支持中文的编码格式(如utf-8,gbk,gb2312)。
JSP中文乱码解决方案
JSP中⽂乱码解决⽅案学习JSP的过程中总会碰到中⽂乱码问题,有的是post⽅式提交没问题,⽤get⽅式提交有乱码,还有的是部署到tomcat中没问题,在Eclipse中启动tomcat,发现⽤get⽅式提交有乱码。
产⽣乱码的根源是tomcat、java所⽤的编码⽅式不同。
所以要解决中⽂乱码问题,⾸先要保证各个页⾯所⽤的编码⽅式⼀致,不管是html页⾯还是jsp页⾯,都指定为同⼀种编码⽅式,如GB18030。
(1)html页⾯<meta charset="GB18030">(2)jsp页⾯<%@ page language="java" contentType="text/html; charset=GB18030"pageEncoding="GB18030"%><meta http-equiv="Content-Type" content="text/html; charset=GB18030">可以在Eclipse⾥设置html页⾯及jsp页⾯的编码⽅式统⼀为GB18030接下来,就是指定tomat所⽤的编码⽅式了。
打开tomcat⽬录下的conf⽬录下的server.xml⽂件,修改<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>该⾏为:<Connector port="8080" protocol="HTTP/1.1" URIEncoding="GB18030"connectionTimeout="20000"redirectPort="8443" />注意红⾊加粗部分是新增的。
jsp中文乱码处理
JSP中文乱码1,最基本的乱码问题。
这个乱码问题是最简单的乱码问题。
一般新手会出现。
就是页面编码不一致导致的乱码。
<%@ page language="java" pageEncoding="gbk" %><%@ page contentType="text/html;charset= gbk " %><html><head><title>中文问题</title><meta http-equiv="Content-Type" content="text/html; charset= gbk "></head></head><body>我是个好人</body></html>以上红色字体,这三个部分的编码格式必须一致,否则会出现乱码2、表单使用Post方式提交后接收到的乱码问题这个问题也是一个常见的问题。
这个乱码也是tomcat的内部编码格式iso8859-1在捣乱,也就是说post提交时,如果没有设置提交的编码格式,则会以iso8859-1方式进行提交,接受的jsp却以GBK的方式接受。
导致乱码。
既然这样的原因,下面有几种解决方式,并比较。
A)接受参数时进行编码转换String str = newString(request.getParameter("something").getBytes("ISO-8859-1"), "GBK") ;这样的话,每一个参数都必须这样进行转码。
很麻烦。
但确实可以拿到汉字。
B)在请求页面上开始处,执行请求的编码代码-request.setCharacterEncoding("GBK")这个方法也就对post提交的有效果,对于get提交和上传文件时的enctype="multipart/form-data"是无效的。
JSP中文乱码问题解决办法
JSP中文乱码问题解决办法当用request对象获取客户提交的汉字字符时,会出现乱码问题,所以对含有汉字字符的信息必须进行特殊处理。
常见的几种字符集编码:⏹ASCII码:不支持中文⏹ISO-8859-1:不支持中文⏹GB2313、GBK:支持中文⏹Unicode:支持中文⏹UTF-8:支持中文在解决JSP中文乱码问题前,弄清以下几点:(1) windows平台采用的默认字符集编码是:GBK(2) IE浏览器默认采用UTF-8字符集编码方式发送Http请求。
(3) Tomcat在处理Get请求时,永远采用ISO-8859-1编码;Tomcat在处理Post请求时,默认采用ISO-8859-1编码;如果进行了如下设置request.setCharacterEncoding(“GBK”),则采用GBK编码。
可以使用如下几种方式解决JSP中文乱码问题。
1、方法一:调用自定义的转换函数<%@page contentType="text/html;charset=GB2312"%><%!public String getStr(String s) {String str = s;try {byte[] b = str.getBytes("ISO-8859-1");str = new String(b);return str;} catch (Exception e) {return str;}}%>使用内置对象request将获取的数据,使用ISO-8859-1进行重新编码,并保存到一个字节数组中,然后调用new String()方法,以GBK方式将这个字节数组构造出一个新的字符串,这个新的字符串就是我们想要的结果。
适用于以下三种情况:(1) 以Get方式提交表单,提交的数据中包含汉字字符。
(2) 以Post方式提交表单,提交的数据中包含汉字字符。
JSP乱码解决思路总结
JSP乱码解决思路总结JAVA学习2009-10-24 08:55:47 阅读127 评论0 字号:大中小订阅对于Java由于默认的编码方式是UNICODE,所以用中文也易出问题,常见的解决是String s2 = new String(s1.getBytes("ISO-8859-1"),"GBK");前三种方法是我比较常用的方法,别人的经验告诉我:通常get方法通过改server.xml解决,post方法通过过滤器或者设置字符集解决,呵呵,不知道是否可行!1、utf8解决JSP中文乱码问题一般说来在每个页面的开始处,加入:<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><%request.setCharacterEncoding("UTF-8");%>charset=UTF-8 的作用是指定JSP向客户端输出的编码方式为"UTF-8"pageEncoding="UTF-8" 为了让JSP引擎能正确地解码含有中文字符的JSP页面,这在LINUX中很有效request.setCharacterEncoding("UTF-8"); 是对请求进行了中文编码有时,这样仍不能解决问题,还需要这样处理一下:String msg = request.getParameter("message");String str=new String(msg.getBytes("ISO-8859-1"),"UTF-8");out.println(st);2、Tomcat 5.5 中文乱码(利用tomcat已经写好的字符集过滤器)1)只要把%TOMCAT安装目录%/webapps\servlets-examples\WEB-INF\classes\filters\SetCharacterEncodingFilter.class 文件拷到你的webapp目录/filters下,如果没有filters目录,就创建一个。
5种JSP页面显示为乱码的解决方法
5种JSP页面显示为乱码的解决方法5种JSP页面显示为乱码的解决方法1. JSP页面显示乱码。
2. Servlet接收Form/Request传递的参数时显示为乱码3. JSP接收Form/Request传递的参数时显示为乱码4. 用<jsp:forward page="catalog2.html"></jsp:forward>时页面显示乱码5. 数据库存取的时候产生乱码。
下面给出全部解决方法:1. JSP页面显示乱码。
第一种为在页面的开头加上:<%@ page language="java" contentType="text/html; charset=GBK" pageEncoding="GBK"%> <!--这里的GBK可以由gb2312代替,此处以GBK为例。
下同 -->注:有时候如果不再页面开头加上这句,则页面中无法保存中文字符,并提示:中文字符在不能被iso-8859-1字符集mapped,这是由于默认情况下,JSP是用iso-8859-1来编码的,可以在Window->Preferences->General->Content Type选项下,在右边的窗口选择Text->Jsp,然后在下面的Default Encoding由默认的iso-8859-1改为GBK,然后点击update即可解决。
然而这种方式会带来一些问题:由于这一句在其他文件include该文件的时候不能被继承,所以include它的文件也需要在文件开头加上这句话,此时如果用的是pageEncoding="gbk"则会出现问题。
类似于org.apache.jasper.JasperException: /top.jsp(1,1) Page directive: illegal to have multiple occurrences of contentType with different values (old: text/html;charset=GBK, new: text/html;charset=gbk).类似地,如果两个文件一个用的是gbk,一个用的是gb2312也会出现问题。
JSP中汉字乱码现象分析与解决
3 结语
JSP 中出现汉字乱码现象的场景各种各样,解决的 方法不尽相同, 然而很多 JSP 教材并没有对此进行充 分的介绍以及提出相应的解决方法。 毋容置疑,汉字乱 码问题并不是 JSP 教学中的一个主要知识点, 但也是 一个无法回避的问题。 教师应该适时为学生介绍解决 汉字乱码的正确方法, 避免因该问题影响对其他主要 知识点的教学, 甚至影响学生的学习兴趣和学习积极 性。
Java 核心 API 中的 包有一个 URLEncoder 类[3],其 中 的 encode 方 法 可 以 基 于 某 种 字 符 编 码 方 式 将 一 个 字 符 串 转 换 成 application/x-www -form-urlencoded 格式。 在超链接标记中设置请求参数时,可以利 用该方法事先将包含汉字的参数数据进行格式转换, 这样可以避免汉字乱码的出现,例如:
和响应的编码方式都被默认为是西欧的 ISO-8859-1。 Web 容器对 JSP 文件的处理会经历转换和执行两
个阶段[1]。 在转换阶段,Web 容器会依据指定的文件编 码 方 式 读 入 JSP 文 件 、将 其 转 换 成 实 现 类 (Servlet 类 ) 并进行编译产生.class 文件; 在执行阶段,Web 容器会 创建并初始化实现类的实例、 执行实例的服务方法 (_jspService 方法),然后将输出内容按照指定的响应编 码方式编码产生响应。
pageEncoding 和 contentType 属性用于指定相关内容的 字符编码方式,例如:
NetBeans IDE 环境下创建 JSP 文件时, 一般不会发生 这类错误, 因为工具总是按照指定的编码方式保存文 件, 即 JSP 文件实际采用的编码方式与指定的编码方 式总是一致的。
精选JSP中文乱码的产生原因及解决方案
精选JSP中文乱码的产生原因及解决方案JSP中文乱码的产生原因及解决方案在JSP的开发过程中,经常出现中文乱码的问题,可能一直困扰着大家,现在把JSP开发中遇到的中文乱码的问题及解决办法写出来供大家参考。
首先需要了解一下Java中文问题的由来:Java的内核和class文件是基于unicode的,这使Java程序具有良好的跨平台性,但也带来了一些中文乱码问题的麻烦。
原因主要有两方面,Java和JSP文件本身编译时产生的乱码问题和Java程序于其它媒介交互产生的乱码问题。
首先Java(包括JSP)源文件中很可能包含有中文,而Java和JSP源文件的保存方式是基于字节流的,如果Java和JSP编译成class文件过程中,使用的编码方式与源文件的编码不一致,就会出现乱码。
基于这种乱码,建议在Java文件中尽量不要写中文(注释部分不参与编译,写中文没关系),如果必须写的话,尽量手动带参数-ecoding GBK或-ecoding gb2312或-ecoding UTF-8编译;对于JSP,在文件头加上<%@ page contentType="text/html;charset=GBK"%>或<%@ page contentType="text/html;charset=gb2312"%>基本上就能解决这类乱码问题。
下面是一些常见中文乱码问题的解决方法(下面例子中ecoding 采用的是gb2312,也可设为ecoding GBK或ecoding UTF-8):一、JSP页面乱码这种乱码问题比较简单,一般是页面编码不一致导致的乱码,一般新手容易出现这样的问题,具体分以下两种情况:➢未指定使用字符集编码下面的显示页面(display.jsp)就出现乱码:<html><head><title>JSP的中文处理</title><meta http-equiv="Content-Type" content="text/html charset=gb2312"></head><body><%out.print("JSP的中文处理");%></body></html>这种乱码的原因是没有在页面里指定使用的字符集编码,JSP页面中出现了中文字符,而默认的ISO-8859-1字符集中无中文字符,解决方法:只要在页面开始地方用下面代码指定字符集编码即可,在JSP页面中指定编码方式(gb2312),和浏览器解码方式设置相同,即在页面的第一行加上:<%@ page contentType="text/html; charset=gb2312"%>,就能够消除乱码了。
JSP技术中文乱码的原因及解决方法
JSP 技术中文乱码的原因及解决方法杨金花(西安铁路职业技术学院陕西西安710014)摘要:JSP 技术广泛应用于动态网页制作,但在应用中文字符时常常出现乱码。
以前有关JSP 技术中文乱码的研究,只是侧重于对常见的几种中文乱码情况分析,并从网页代码方面进行研究,然后给出相应的代码,缺少对造成中文乱码原因的研究。
本文从造成乱码的根本原因入手进行分析,以JSP 技术工作过程为线索,提出新的研究思路:从开发Java 程序时所涉及的开发环境以及使用的开发工具着手,研究字符的存储与编码的关系,将影响Java 中字符编码的原因分为内因和外因。
研究结果表明,在使用JSP 技术的过程中,中文字符的编码不仅在JSP 工作过程中,会发生编码的转换,而且会因开发环境以及使用开发工具不同,使存储在内存的编码形式发生转换,每种编码之间的转换没有规律。
本文系统地分析了Java 中字符编码的转换,最后针对JSP 中常见的中文乱码情况,给出了相应的解决方法。
关键词:字符编码;中文乱码;JSP 技术;Servlet 中图分类号:TP311文献标识码:A文章编号:1674-6236(2011)01-0025-03The reason and solution of Chinese garbled code in JSP technologyYANG Jin -hua(Xi ’an Railway Vocational Technical College ,Xi ’an 710014,China )Abstract:JSP technology is widely used in the production of dynamic web pages ,but the chinese characters in its application often garbled.Chinese garbled before the JSP technology research ,is focused on several common chinese garbled on the situation analysis ,and researches aspects of the code from the page ,and then gives the corresponding code ,the lack of research into the reasons causes the chinese garbled.This paper analyses from the real causes of the underlying cause garbled.JSP technology researches to the work process for the clues ,puts forward new research ideas :the development of Java programs involved in the development environment and start using the development tools ,storage and encoding of character relationships ,affecting the character encoding in Java is divided into internal and external reasons.The results show that use of JSP technology in the process ,the chinese character code in the JSP course of their work not only will happen coding of the convert ,but also because of development environment ,and use the development tools ,the code stored in memory in different forms.Between each code conversion is not the law.This paper systematically analysed the Java character encoding conversion ,in the end for the JSP common situation in the chinese garbled ,the corresponding solution was given.Key words:character encoding ;chinese garbled ;JSP technology ;ServletJSP ,也就是Java Server Page (Java 服务器网页),是目前市场上主流的分布式应用程序开发平台。
JSP中文乱码问题完全解决方案
request.setCharacterEncoding(this.encodingName);
}
chain.doFilter(request, response);
}
public void destroy() {
} else {
this.enable = false;
}
}
public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {
四. 数据库操作中文乱码
在建立数据库的时候,应该选择支持中文的编码格式,最好能和JSP页面的编码格式保持一致,这样就可以尽可能减少数据库操作的中文乱码问题。同时在JDBC连接数据库的时候可以使用类似下面这种形式的URL。jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs;useUnicode=true;characterEncoding=gb2312
import javax.servlet.UnavailableException;
public class SetCharacterEncodingFilter implements Filter {
protected FilterConfig filterConfig;
protected String encodingName;
}
}
在web.xml中添加过滤器的配置如下:
<filter>
解决JSP中文乱码问题
解决JSP中文乱码问题中文乱码示例程序见文件code.java1.乱码如何产生?本质上都是由于字符串原本的编码格式与读取时解析用的编码格式不一致导致的。
例如:String s = "你好哦!";System.out.println( new String(s.getBytes(),"UTF-8")); //错误,因为getBytes()默认使用GBK编码,而解析时使用UTF-8编码,肯定出错。
其中getBytes() 是将unicode 转换为操作系统默认的格式的字节数组,即"你好哦"的GBK 格式,new String (bytes, Charset) 中的charset 是指定读取bytes 的方式,这里指定为UTF-8,即把bytes的内容当做UTF-8 格式对待。
如下两种方式都会有正确的结果,因为他们的源内容编码和解析用的编码是一致的。
System.out.println( new String(s.getBytes(),"GBK"));System.out.println( new String(s.getBytes("UTF-8"),"UTF-8"));2.编码基本知识Unicode、UTF-8 和ISO8859-1到底有什么区别将以"中文"两个字为例,经查表可以知道其GB2312编码是"d6d0 cec4",Unicode编码为"4e2d 6587",UTF编码就是"e4b8ad e69687"。
注意,这两个字没有iso8859-1编码,但可以用iso8859-1编码来"表示"。
最早的编码是iso8859-1,和ascii编码相似。
但为了方便表示各种各样的语言,逐渐出现了很多标准编码,重要的有如下几个。
JSP中文乱码问题(Eclipse)
JSP中⽂乱码问题(Eclipse)默认已设置以下属性为“utf-8”contentType=”text/html;charset=UTF-8”的作⽤是指定服务器响应给浏览器的编码。
pageEncoding=”UTF-8”的作⽤是设置JSP编译成Servlet时使⽤的编码。
JSP要经过两次的“编码”,第⼀阶段会⽤pageEncoding,第⼆阶段会⽤utf-8⾄utf-8,第三阶段就是由Tomcat出来的⽹页,⽤的是contentType。
第⼀阶段是jsp转译(翻译)成.Java,它会根据pageEncoding的设定读取jsp,结果是由指定的编码⽅案翻译成统⼀的UTF-8 JAVA源码(即.java),如果pageEncoding设定错了,或没有设定,出来的就是中⽂乱码。
第⼆阶段是从源码(.java)编译到字节码⽂件(.class),不论JSP编写时候⽤的是什么编码⽅案,经过这个阶段的结果全部是UTF-8的encoding的java源码。
JAVAC⽤UTF-8的encoding 读取java源码,编译成UTF-8 encoding的⼆进制码(即.class),这是JVM对常数字串在⼆进制码(java encoding)内表达的规范。
第三阶段是Tomcat(或其的application Container)载⼊和执⾏阶段⼆的来的JAVA⼆进制码,输出的结果,也就是在客户端见到的,这时隐藏在阶段⼀和阶段⼆的参数contentType就发挥了功效。
从Tomcat5.x开始,GET和POST⽅法提交的信息,Tomcat采⽤了不同的⽅式来处理编码,对于POST请求,Tomcat会仍然使⽤request.setCharacterEncoding⽅法所设置的编码来处理,如果未设置,则使⽤默认的iso-8859-1编码。
⽽GET请求则不同,Tomcat对于GET请求并不会考虑使⽤request.setCharacterEncoding⽅法设置的编码,⽽会永远使⽤iso-8859-1编码。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
JSP中文乱码问题的解决作者:未知来自:未知时间: 2006-12-06浏览统计总:39 |月:4 | 周:3 | 日:1字符内码每个国家(或区域)都规定了计算机信息交换用的字符编码集,如美国的扩展ASCII码、中国的GB2312-80、日本的 JIS 等,作为该国家(区域)信息处理的基础,有着统一编码的重要作用。
由于各本地字符集代码范围重叠,相互间信息交换困难,软件本地化版本独立维护成本较高。
因此有必要将本地化工作中的共性抽取出来,做一致性处理,将特殊的本地化处理内容降低到最少,这就是所谓的国际化(I18N)。
各种语言信息被规范为本地信息,而底层字符集采用包含了所有字符的Unicode。
字符内码(character code)指的是用来代表字符的内码。
我们在输入和存储文档时都要使用内码,内码分为单字节内码和双字节内码。
单字节内码的英文全称是Single-Byte Character Sets (SBCS),可以支持256个字符编码;双字节内码的英文全称是Double-Byte Character Sets(DBCS),可以支持65000个字符编码,主要用来对大字符集的东方文字进行编码。
CodePage指的是一个经过挑选的以特定顺序排列的字符内码列表,对于早期的单字节内码的语种,CodePage中的内码顺序使得系统可以按照此列表来根据键盘的输入值给出一个对应的内码。
对于双字节内码,给出的是MultiByte到Unicode的对应表,这样就可以把以Unicode 形式存放的字符转化为相应的字符内码。
引入对CodePage的支持主要是为了访问多语种文件名,目前在NTFS和FAT32/VFAT下的文件系统上都使用Unicode,这需要系统在读取这些文件名时动态地将其转换为相应的语言编码。
相信了解JSP代码的读者对ISO8859-1一定不陌生,ISO8859-1是我们平时使用比较多的一个CodePage,它属于西欧语系。
GB2312-80 是在国内计算机汉字信息技术发展初始阶段制订的,其中包含了大部分常用的一、二级汉字和9区的符号。
该字符集是几乎所有的中文系统和国际化的软件都支持的中文字符集,这也是最基本的中文字符集。
GBK 是 GB2312-80 的扩展,是向上兼容的。
它包含了20902个汉字,其编码范围是 0x8140~0xFEFE,剔除高位 0x80 的字位,其所有字符都可以一对一映射到 Unicode 2.0,也就是说Java 实际上提供了对 GBK 字符集的支持。
>GB18030-2000(GBK2K) 在 GBK 的基础上进一步扩展了汉字,增加了藏、蒙等少数民族的文字。
GBK2K 从根本上解决了字位不够、字形不足的问题。
不同开发平台的区别1.Tomcat 4开发平台Windows 98/2000下的Tomcat 4以上版本都会出现中文问题(而在Linux下和Tomcat 3.x 中则没有问题),主要表现是页面显示乱码。
在IE中调整字符集为GB2312,就可以正常显示了。
为解决这个问题,可在每个JSP的页面开始处加上<%@ page language=“Java” contentType=“text/html; charset=gb2312”%>。
不过,这还不够,虽然这时显示了中文,但是发现从数据库读出的字段变成了乱码。
经过分析发现: 在数据库中保存的中文字符是正常的,数据库用ISO8859-1字符集存取数据,而Java程序在处理字符时默认采用统一的ISO8859-1字符集(这也体现了Java国际化思想),所以在数据添加的时候Java和数据库都是以ISO8859-1方式处理,这样不会出错。
但是在读取数据的时候就出现问题了,因为数据读出也采用ISO8859-1字符集,而 JSP的文件头中有语句<%@ page language=“Java” contentType=“text/html; charset=gb2312”%>,这说明页面采用GB2312的字符集显示,这样就和读出的数据不一样。
这时页面显示从数据库中读出的字符是乱码,解决的方法是对这些字符转码,从ISO8859-1转成GB2312,就可以正常显示了。
这个解决办法对很多平台具有通用性,读者可以灵活运用。
2.Tomcat 3.x、Resin及Linux平台在Tomcat 3.x、Resin中或是在Linux下,没有加入语句<%@ page language=“Java”contentType=“text/html; charset=gb2312”%>,而页面中的<meta http-equiv=“Content-Type” content=“text/html; charset=gb2312”>语句起了作用,此时可以正常显示。
相反,如果加上<%@ page language=“java”contentType=“text/html; charset=gb2312”%>系统会报错,说明Tomcat 4以上版本的引擎在处理JSP时还是有差别的。
另外,对于不同的数据库如SQL Server,Oracle,Mysql,Sybase等,字符集的选择很重要。
如果考虑多语言版本,数据库的字符集就应该统一采用ISO8859-1,需要输出的时候在不同的字符集之间做转换就可以了。
以下是针对不同平台的总结:(1) JSWDK只适合于普通开发,稳定性和其他问题可能不如商业软件。
由于JDK 1.3版性能要好于JDK 1.2.2很多,并且对中文的支持也较好,所以应该尽量采用。
(2) 作为免费的商业软件,Resin不仅速度快、稳定、自动编译,还可以指出出错行,并可在服务器端支持使用JavaScript等,而且对中文的支持也很好。
(3) Tomcat仅仅是一个对JSP 1.1、Servlet 2.2标准的实现, 我们不应该要求这个免费软件在细节和性能上都面面俱到, 它主要考虑英文用户, 这也是为什么不做特殊转换,汉字用URL方法传递就有问题的原因。
大部分IE浏览器缺省始终以UTF-8发送, 这似乎是Tomcat 的一个不足, 另外Tomcat不管当前的操作系统是什么语言, 都按ISO8859去编译JSP, 似乎也欠妥。
JSP代码的中文处理在JSP代码中以下几处经常需要涉及到中文处理:1. 在URL中附带中文参数。
这里中文参数通常可以直接读取,例如: <%=request.getParameter(“showword”)%>2. 在JSWDK中读取HTML表单提交的中文值这时需要加以编码,较为简洁的写法是:String name1=new String(request.getParameter(“user_id”).getBytes(“ISO8859_1”))。
另外,在JDK 1.3的支持下,不需加入<%@ page contentType=“text/html;charset=gb2312”%> ,而在JDK 1.2.2 以下,即使以上两种方法同时运用也很不稳定。
但在Resin平台,情况较好,只要在页面第一行加入:<%@ page contentType=“text/html;charset=gb2312”%>即可正确处理中文,如果再加代码则反而不对。
3.在JSWDK中Session包含的中文,如果从表单中读出的值经过编码可正确显示,但直接赋予中文值则不行,而Resin平台则很好。
4. 在编译Servlet和JSP时加入代码选项。
在编译Servlet时使用Java-Encoding ISO8859-1 myservlet.java;在JSP的ZONE配置文件中,修改编译参数为:Compiler=builtin - javac- encoding ISO8859-1。
使用这种方法后,不需要做其他的改动就可以正常显示中文了。
另外,流行的关系数据库系统都支持数据库Encoding,也就是说在创建数据库时可以指定它自己的字符集设置,数据库的数据以指定的编码形式存储。
当应用程序访问数据时,在入口和出口处都会有 Encoding 转换。
对于中文数据,数据库字符编码的设置应当保证数据的完整性。
GB2312、GBK、UTF-8 等都是可选的数据库 Encoding,也可以选择 ISO8859-1 (8-bit),但会增加了编程的复杂度,ISO8859-1不是推荐的数据库 Encoding。
在JSP/Servlet编程时,可以先用数据库管理系统提供的管理功能检查其中的中文数据是否正确。
处理方法实例下面是两个具体的中文乱码解决实例,读者仔细研究后可能会有所收获。
1.常见的字符转换方法将Form 中的值传送到数据库中再取出来后全变成了“?”。
Form用POST 提交数据,代码中使用了语句:String st=new(request.getParameter(“name”).getBytes(“ISO8859_1”)),而且也声明了charset=gb2312。
要处理Form中传递的中文参数,应该在JSP中加入下面的代码,另外定义一个专门解决这个问题的getStr类,然后对接收到的参数进行转换:String keyword1=request.getParameter(“keyword1”);keyword1=getStr(keyword1);这样就可以解决问题了,代码如下:<%@ page contentType=“text/html;charset=gb2312”%><%!public String getStr(String str){try{String temp_p=str;byte[] temp_t=temp_p.getBytes(“ISO8859-1”);String temp=new String(temp_t);return temp;}catch(Exception e){ }return “NULL”;}%><%--测试--%><% String keyword=“创联网络技术中心欢迎您的到来”;String keyword1=request.getParameter(“keyword1”);keyword1=getStr(keyword1);out.print(keyword);out.print(keyword1);%>2. JDBC Driver的字符转换目前大多数JDBC Driver采用本地编码格式来传输中文字符,例如中文字符“0x4175”会被转成“0x41”和“0x75”进行传输。