第13章 国际化和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中文显示乱码的解决方案

不用编码就可以插入了
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中文乱码处理

示例:显示不同地区的时间和 HelloWorld
• • • • • Locale lo3=new Locale("en","US"); DateFormat df3=DateFormat.getDateTimeInstance(DateFormat.LONG,DateFormat.LONG,lo3); out.println("<h3>in English</h3>"); out.println("Hello world!"); out.println(" "+df3.format(new Date())+"<hr>");
2.2Get提交乱码-1
• 用Get方式传递参数,中文字符会出现乱码
客户端通过GET提交中文编码问题简单流程:
假如:
客户端和服务器用gb2312 HTTP传输编码用ISO8859_1 则: 服务器需要指示客户端文档的编码方式
ISO8859_1 ISO8859_1 gb2312
gb2312
2.2Get乱码-2
• • • • • • • • • • • • • • • <%@ page contentType="text/html; charset=UTF-8" import="java.io.*,java.util.*,java.text.*,java.text.DateFormat" %> <html> <head><title>language</title></head> <body bgcolor="#ffffff"> <% Locale lo1=new Locale(“ko”,“”);//构建一个本地对象 DateFormat df1=DateFormat.getDateTimeInstance(DateFormat.LONG,DateFormat.LONG,lo1); out.println("<h3>in Korean</h3>"); out.println("\uc548\ud558\uc138\uc694\uc138\uacc4"); out.println(" "+df1.format(new Date())+"<hr>"); Locale lo2=new Locale("ja",""); DateFormat df2=DateFormat.getDateTimeInstance(DateFormat.LONG,DateFormat.LONG,lo2); out.println("<h3>in Japanese</h3>"); out.println("\u4eca\u65e6\u306f\u4e16\u754c"); out.println(" "+df2.format(new Date())+"<hr>");
如何处理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中文乱码的问题一、Java中文问题的由来Java的内核和class文件是基于unicode的,这使Java程序具有良好的跨平台性,但也带来了一些中文乱码问题的麻烦。
原因主要有两方面,Java和JSP 文件本身编译时产生的乱码问题和Java程序于其他媒介交互产生的乱码问题。
首先Java (包括JSP)源文件中很可能包含有中文,而Java和JSP 源文件的保存方式是基于字节流的,如果Java和JSP编译成class 文件过程中,使用的编码方式与源文件的编码不一致,就会出现乱码。
基于这种乱码,建议在Java 文件中尽量不要写中文(注释部分不参与编译写中文没关系)如果必须写的话尽量手动带参数-ecoding GBK或-ecoding gb2312编译对于JSP在文件头加上<%@ page contentType=text/html;charset=GBK%:^<%@ page contentType=text/html;charset=gb2312%>基本上就能解决这类乱码问题。
二、常见的解决方式1,最基本的乱码问题。
这个乱码问题是最简单的乱码问题。
一般新会出现。
就是页面编码不一致导致的乱码。
<%@ page language=java pageEncoding=UTF-8%><%@ page contentType=text/html;charset=iso8859-1%><head><title> 中文问题</Mtle><meta http-equiv=Content-Type content=text/html;charset=UTF-8></head></head><body>我是个好人</body></html>三个地方的编码。
第一个地方的编码格式为jsp文件的存储格式。
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页面显示中文乱码: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、Struts2下载中文文件名乱码问题方案一:原来处理下载的代码如下:response.setHeader("Content-Disposition", "attachment; filename=" + .URLEncoder.encode(fileName, "UTF-8"));下载的程序里有了这句,一般在IE6的下载提示框上将正确显示文件的名字,无论是简体中文,还是日文。
一. 上面方式,也就是先用URLEncoder编码,当中文文字超过17个时,IE6 无法下载文件。
这是IE的bug,参见微软的知识库文章KB816868 。
原因可能是因为ie在处理Response Header 的时候,对header的长度限制在150字节左右。
而一个汉字编码成UTF-8是9个字节,那么17个字便是153个字节,所以便会报错。
微软提供了一个补丁。
这个补丁需要先安装ie6 sp1。
二. 我尝试使用javamail的MimeUtility.encode()方法来编码文件名,也就是编码成=?gb2312?B?xxxxxxxx?= 这样的形式,并从RFC1522 中找到对应的标准支持。
不过很遗憾,IE6并不支持这一个标准。
我试了一下,Firefox是支持的。
三. 按网上很多人提供的解决方案:将文件名编码成ISO8859-1似乎是有效的解决方案,代码如下:response.setHeader( "Content-Disposition", "attachment;filename="+new String(fileName.getBytes("gb2312"), "ISO8859-1" ) );在确保附件文件名都是简体中文字的情况下,那么这个办法确实是最有效的,不用让客户逐个的升级IE。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
方案一:使用指令元素设置字符编码
<%@page contentType="text/html; charset=gb2312"%>
总结esourceBundle类
java.util.ResourceBundle类提供存放和管理 与Locale相关的资源的功能。这些资源包括按 钮上的文字、状态信息、图片名、错误信息和 网页标题等。
国际化的JavaWeb应用的示例
1. 资源文件 • resource_zh_CN.properties • resource_en.properties 2. login.jsp
方案五:使用过滤器设置字符编码
public class EncodingFilter implements Filter { private String encoding; public void init(FilterConfig filterConfig) throws ServletException { this.encoding=filterConfig.getInitParameter("encoding"); } public void doFilter(ServletRequest request, ServletResponse response,FilterChain filterChain) { try { request.setCharacterEncoding(encoding); filterChain.doFilter(request, response); } catch (Exception ex) { ex.printStackTrace(); <filter> } <filter-name>encoding</filter-name> } <filter-class>lesson6.EncodingFilter</filter-class> public void destroy() { <init-param> } <param-name>encoding</param-name> } <param-value>gb2312</param-value> </init-param> </filter> <filter-mapping> <filter-name>encoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
第13章 国际化和JSP中文乱码处理
目标
国际化
JSP中文乱码处理
国际化
本地化和国际化的概念 Java对国际化的支持 国际化的JavaWeb应用的示例
本地化和国际化的概念
在过去,软件开发者在开发应用程序时,将注意力集中于实 现具体的业务逻辑。软件面向的用户群是固定的,软件只需 要支持一种语言。如今,随着跨国业务的迅猛发展,需要同 一个软件同时支持多种语言和国家。 国际化[Internationalization](简称为I18N)指的是在软 件设计阶段,就应该使软件具有支持多种语言和地区的功能。 软件的本地化与国际化的区别如下图:
中文Web 客户 英文Web 客户 Web应用 中文版 Web应用 英文版 中文Web 客户 Web应用 英文Web 客户 英文资源 文件 中文资源 文件
Java对国际化的支持
Locale类
java.util.Locale类是最重要的Java国际化类, 在Java语言中,几乎所有对国际化和本地化的 支持都依赖于这个类。Locale类的实例代表一 个特定的语言和地区。
JSP中文乱码处理
在Web应用中,当客户端向服务器提交请求的时候,提交的信息 一般用本地字符集进行编码,如中文采用GB2312或GBK字符集 (GBK是GB2312的扩展),英文或西欧文字采用ISO-8859-1 字符集。由于Java程序中一律采用Unicode处理字符串,当JSP 文件转成Java文件时,大部分服务器默认使用ISO-8859-1字符 集来进行编码,所以出现乱码问题也是在所难免的。于是,就要 求我们在编写程序的时候,进行编码转换。 本章中会介绍以下几种JSP中文乱码的解决方案。
login.jsp
<%@page contentType="text/html; charset=GBK"%> <%@page import="java.util.*,java.io.*,java.text.*"%> <html><head><title>login</title></head><body> <% String language = request.getParameter("language"); Locale locale; if (language == null || language.equals("")) { locale = request.getLocale(); } else { locale = new Locale(language); } ResourceBundle rb = ResourceBundle.getBundle("resource", locale); %> <form action="login.jsp" method="POST"> <select name="language"> <option value="zh_CN"><%=rb.getString("china")%> </option> <option value="en"><%=rb.getString("usa")%> </option> </select> <input type="submit" value="go"> </form><hr><h3><%=rb.getString("title")%></h3> <form action="" method="POST"> <%=rb.getString("username")%><input type="text"><br> <%=rb.getString("password")%><input type="password"> <input type="submit" value="<%=rb.getString("submit")%>"> </form></body></html>
资源文件
resource_en.properties
title=SystemLogin username=UserName: password=Password: submit=Login china=China usa=USA
resource_zh_CN.properties
title=\u7cfb\u7edf\u767b\u5f55 username=\u7528\u6237\u540d\uff1a password=\u5bc6\u7801\uff1a submit=\u767b\u5f55 china=\u4e2d\u56fd usa=\u7f8e\u56fd
方案二:使用request对象设置字符编码
request.setCharacterEncoding("gb2312");
方案三:使用String对象设置字符编码
String user = request.getParameter(“user"); user = new String(user.getBytes("iso-8859-1"), "gb2312");
方案四:修改TOMCAT服务器的server.xml文件
<Connector port="8080" maxHttpHeaderSize="8192" maxThreads="150" minSpareThreads="25“ maxSpareThreads="75“ enableLookups="false“ redirectPort="8443" acceptCount="100" connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="gb2312"/>