JSP乱码一般有什么解决办法?
由于jdk中只规定了必须有一些unicode utf8
等编码的实现,
好像对汉字编码没有什么实现的硬性规定,
所以有时候就会出现乱码问题。
数据库访问时的乱码问题,可以数据库连接中加上useunicode =true 以及用gbk 或gb2312编码就可以了:
在建立数据库时,将数据库中的所有表的编码方式都设置为gbk,原因是JSP中也使用了gbk编码,这样统一的结果是可以减少
很多不必要的编码转换问题。另外,在使用JDBC连接MySQL数据库时,连接字符串写成如下形式可以避免一些中文问题:
jdbc://mysql://hostname:port/DBname?user=username&
password=pwd&
useUnicode=True&
characterEncoding=gbk
如果是以数据源的方式连接数据库,在配置文件中使用:
url
jdbc://mysql://hostname:port/DBname?&useUnicode=True&characterEncoding=gbk
但是,如果使用一个已经存在的数据库,数据库的编码方式是ISO-8859-1,而Web应用中使用UTF-8,且数据库中已经有很多
重要信息,因此不能通过更改数据库的编码方式来解决问题。这个时候,在往数据库中写数据库时,一定要在JDBC连接字符串中加入
“useUnicode=True&characterEncoding=ISO-8859-1”,这样可以顺利的往数据库中写入正常的数据。但是,在将数据读出数据库时
,乱码又会出现,这个时候就应该在数据取出时对其转码,可以将转码功能写为一个函数,具体实现如下:
public String charConvert(String src){
String result=null;
if(src!=null){
try{
// 使用给定的 charset 将此 String 编码到 byte 序列,并将结果存储到新的 byte 数组->通过使用指定的 charset 解码指定的
byte 数组,构造一个新的 String。
result=new String(src.getBytes("ISO-8859-1"),"gbk");
}catch(Exception e)
{
result=null;
}
}
return result;
} 于是,在从数据库读出数据过后调用charConvert(rs.getString("colName")),这样就可以正常显示数据库中的中文数据了
。
JSP中输出中文的乱码问题
所谓在JSP输出中文,即直接在JSP中输出中文,或者给变量赋中文值再输出等,这种情况下的乱码问题往往是因为没有给JSP页面制
定显示字符的编码方式,解决问题如下:
·在JSP页面头部加上语句(在Servlet页面中使用
httpServletResponse.setContentType("text/html;charset=gbk")),最好同时在JSP页面的head部分加上<meta http-
equiv="Content-Type" content="text/html;charset=gbk">
·在每次要输出中文的地方主动转换编码方式,比如要在页面中输入“中文”二字,就可以用以下方式:
<%
String str="中文";
byte[] tmpbyte=str.getBtyes("ISO-8859-1");
str=new String(tmpbyte);
out.print(str);
%>
获取表单提交的数据时的中文乱码问题
在没有加任何其他处理之前,用request.getParameter(panamName)获取表单提交中的数据,且表单数据中含有中文时,返回
的字符串会出现乱码。出现这种问题的原因是Tomcat的J2EE实现对表单提交,即以POST方式提交的参数采用默认的ISO-8859-1来处理
。
比如,建立一个test.jsp,内容为:
<%
String str=request.getParameter("chStr");
if(str==null) str="没有输入值";
%>
中文Test
你输入的内容为:
请输入中文:
运行过后,在输入框中输入汉字“中文”,提交过后再显示出来后就变成了一堆乱码。解决此问题的办法有两个。一是不修
改其他设置,只是在将表单中的中文数据取出来过后再转换编码,方法如语句String str=request.getParameter("chStr");String
str=new String(sre.getByte("ISO-8859-1"),"gbk"),但这种方法只是从一个局部来考虑问题,如果这样的地方太多,就不得不将这
条语句重复写很多次,在比较大的项目中,这是一种不太可行的方案。另一个方法就是让对所有页面的请求都通过一个Filter,将处
理字符集设置为gbk。具体的做法如下(在Tomcat的webapps/servlet-examples目录有一个完整的例子,也可以参考其中web.xml和
SetCharacter EncodingFilter的配置):
首先将%TOMCAT%/webapps/servlets-examples/Web-INF/classes/filters/目录下的文件SetCharacterEncodingFilter.class
拷贝到自己应用的/Web-INF/classes/com/util/filter目录下;然后再在web.xml文件的后面加上如下配置代码:
Set Character Encoding
com.ccut.struts.SetCharacterEncodingFilter
encoding
gbk
Set Character Encoding
/*
URL中的中文问题
对于直接通过在URL中传递中文参数,如“http://localhost/a.jsp?str=中文”这样的get请求,在服务端用
request.getParameter("name")时返回的往往是乱码。按以上的做法设置Filter没有用,用request.setCharacterEncoding("gbk")
的方式,仍然不管用。
例如,建立test2.jsp文件,内容为:
<%
String str=request.getParameter("chStr");
if(str==null) str="没有输入值";
%>
中文Test
你输入的内容为:
点击这里提交中文参数
运行后,可见通过URL传递的中文参数取出来过后变成了乱码,造成这种结果的原因是Tomcat中以get方式提交的请求对
query-string处理时采用了和post方法不一样的处理方式。
解决这个问题的方法是打开Tomcat安装目录下的/conf/server.xml文件,找到Connector块,往其中添加URIEncoding="gbk"
,添加过后完整的Connector块代码如下:
<Connector port="8080"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
debug="0" connectionTimeout="20000"
disableUploadTimeout="true"
URIEncoding="gbk"
/>
在Struts中证实可以解决URI传递乱码问题.
可以这样做
1.设定Tomcat的URI编码为"UTF-8":修改%tomcat%\conf\server.xml中的在中间加入URIEncoding="UTF-8";
2.先在页面上encodeURI(url);
3.后台代码中直接取出来的中文参数就已经OK了.
4. 试一试request.setCharacterEncoding("GBK");
不过这种方法用在servlet中行不通,在servlet中就必须对URI进行处理,Tomcat中有没有加入URIEncoding都没有差别.
刚开始学习jsp的程序员都会遇到这样一个问题,就是网页上的中文无法显示.总结了以下几条方法。
1、在jsp页中加入一条语句:
中文显示就正常了。
2、对于从网页中的文本框通过String parameter = request.getParameter(“parameter”);方式获得的字符串,均是8859_1的编码,
如果想把它显示在网页上就必须得用parameter = new String(parameter.getBytes(“8859_1”),”gb2312”)进行转换,windows和linux这两种系统都是一样的。
有一个简单方法,就是在 getParameter() 方法获取参数之前,使用request.setCharacterEncoding("GB2312");,将提交的信息转化为 GB2312 编码。
3、但是对于将数据写入数据库的问题,采取的方式就不同了:
windows下,必须要采用该字符串转换再插入数据库,而linux下就不需要,而是直接把8859_1编码的字符插入。
如果从数据库中读出的数据,对于windows因为在插入时已经做了转换,所以读出时已经是gb2312的,当把它显示在网页上时,不需要做编码转换,而 linux上的mysql中的数据是8859_1的所以要做编码的转换。
4、 如果你给某个字符串变量赋予一个中文字符串的值,那么在你取出他时,在网页上的显示是不需要做字符转换的,
但是如果你要在linux下做字符的比较,则还需要把字符做parameter = new String(parameter.getBytes(“gb2312”),”8859_1”)的转换。
5、长江电力网站解决中文问题的方法是:
1)在catalina.sh文件中的相关位置添加下面一行
-Dfile.encoding=GBK \
2)在每个jsp文件的最前面添加下面两行
2. 表单中或传递字符串:本来输入的汉字是正常的,但是提交后再显示出来是乱码,因为提交的一般是 ISO8859编码,所以显示的时候要转成GB2312编码:
String S=new String(rs.getString("news").getBytes("gb2312"),"ISO8859_1");
//rs.getString("news")为待转换的字符串
然后使用S字符串的值就可以了
3. 有的服务器端的语言环境如果设成简体中文的也可以解决此类问题
4. 插入数据库中的字符是乱码
看看数据库中支持的是何种编码方式,用类似2中的方式作一下转换即可。
5. 总之,用jsp开发,碰到乱码,你得分析是读的时候发生乱码,还是写的时候发生乱码,用2中的转换,基本就能解决问题,有些时候写的时候做一次转换,例如:
String S=new String(rs.getString("news").getBytes("gb2312"),"ISO8859_1");
//读的时候在转换回来
String S=new String(rs.getString("news").getBytes("ISO8859_1"),"GB2312");
或者把ISO8859-1和GB2312 的位置换一下,自己多试试,就能找到解决问题的办法。
将乱码问题分为三类JSP页面显示中文乱码;表单提交乱码;数据库应用乱码
1) JSP页面内输出中文时出现乱码
解决方案在JSP文件中使用page命令指定响应结果的MIME类型,如<%@ page language="java" contentType="text/html;charset=gb2312" %>
2)表单提交乱码
表单提交时(post和Get方法),使用request.getParameter方法得到乱码,这是因为tomcat处理提交的参数时默认的是iso-8859-1,表单提交get和post处理乱码问题不同,下面分别说明。
(1)POST处理
对post提交的表单通过编写一个过滤器的方法来解决,过滤器在用户提交的数据被处理之前被调用,可以在这里改变参数的编码方式,过滤器的代码如下:
package cn.gov.beijingit.util;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class SetCharacterEncodingFilter implements Filter {
/**
* The default character encoding to set for requests that pass through this
* filter.
*/
protected String encoding = null;
/**
* The filter configuration object we are associated with. If this value is
* null, this filter instance is not currently configured.
*/
protected FilterConfig filterConfig = null;
/**
* Should a character encoding specified by the client be ignored?
*/
protected boolean ignore = true;
// --------------------------------------------------------- Public Methods
/**
* Take this filter out of service.
*/
public void destroy() {
this.encoding = null;
this.filterConfig = null;
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// Conditionally select and set the character encoding to be used
if (ignore || (request.getCharacterEncoding() == null)) {
String encoding = selectEncoding(request);
if (encoding != null) {
request.setCharacterEncoding(encoding);
}
}
// Pass control on to the next filter
chain.doFilter(request, response);
}
/**
* Place this filter into service.
*
* @param filterConfig
* The filter configuration object
*/
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
this.encoding = filterConfig.getInitParameter("encoding");
String value = filterConfig.getInitParameter("ignore");
if (value == null) {
this.ignore = true;
} else if (value.equalsIgnoreCase("true")) {
this.ignore = true;
} else if (value.equalsIgnoreCase("yes")) {
this.ignore = true;
} else {
this.ignore = false;
}
}
protected String selectEncoding(ServletRequest request) {
return (this.encoding);
}
}
web.xml文件加入过滤器
<filter>
<filter-name>Encoding</filter-name>
<filter-class>
cn.gov.beijingit.util.SetCharacterEncodingFilter
</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>gbk</param-value>
<!--gbk或者gb2312或者utf-8-->
</init-param>
<init-param>
<param-name>ignore</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Encoding</filter-name>
<servlet-name>/*</servlet-name>
</filter-mapping>
* 注意filter元素要放在所有web.xml元素之前。
(2) Get方法的处理
tomcat对post和get的处理方法不一样,所以过滤器不能解决get的乱码问题,它需要在其他地方设置。
打开<tomcat_home>\conf目录下server.xml文件,找到对8080端口进行服务的Connector组件的设置部分,给这个组件添加一个属性:URIEncoding="GBK"。修改后的Connector设置为:
<Connector port="8080" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="GBK" />
* 注意修改后重新启动tomcat才能起作用。
3)数据库应用的乱码,本文还是以mysql为例
(1)修改配置文件<mysql_home>\my.init
将default-character-set=latin1修改为default-character-set=gbk
(2) 对接受的中文字符重新编码,例
String name=requset.getParameter("name");
name = new String(name.getBytes("gbk"),"iso8859-1");
4)tomcat5.x的include页面乱码
为了能让tomcat5.x能像tomcat4那样处理include页面,需要修改项目web-info/web.xml文件,把默认的字符集设置成gbk/gb2312就可以了,如:
<jsp-config>
<jsp-property-group>
<description>Special property group for JSP Configuration JSP example.</description>
<display-name>JSPConfiguration</display-name>
&nbs
文章出处:DIY部落(http://www.diybl.com/course/3_program/java/javajs/2008219/100298.html)
你这个明显没有百度一下,太多了。。。
常见的解决方案有四种:string手动转换,页面编码,filter过滤,及数据库处理等。
风色幻想SP的常见问题
不推荐)。2、使用虚拟光驱载入游戏镜像游戏时,提示在光驱内插入光盘解决方法:在设备管理器中禁用物理光驱或者将虚拟光驱盘符调整至物理光驱之前。3、在简体系统中使用繁体版风色幻想SP时出现乱码解决方法:使用Microsoft AppLocale等转码软件进行转码。4、其他游戏问题可以到百度风色幻想SP吧提问讨论。
Steam 令牌手机验证器验证码短信乱码
不同用户收到的短信模板可能不同。实际上,转码后的字符序列是两位一组的ASCII码。举例来说,验证码内容为“2039 3439 3938”表示94998(SP表示空格)。其他模板的恢复方法相似。提供一个简易方案:进入Python3在线编辑器,复制以下代码(字符串部分替换为自己的乱码短信内容),运行即可获取原始信息。
SP3232串口工作时出现乱码是什么原因
检查TX RX管脚的脉冲信号是否有毛刺,如果正常工作出现乱码大多属于这种问题.当然不排除接收信号时软件出现的问题,希望能帮到你.
幻想三国志4外传乱码如何解决?
解决幻想三国志4外传乱码问题的方法如下:首先,确保你已经安装了App转码工具。接着,打开你的电脑,找到“开始”菜单,然后选择“所有程序”> “Microsoft AppLocale”。启动AppLocale后,点击“浏览”选项,定位到你的游戏文件夹,找到名为FS4SP.exe的程序文件。接下来,选择“下一步”,在语言选项中选择...
我的电脑C盘里出现了一些奇怪名字的文件夹
你截图显示的是WIN10用户文件夹,你看不懂的字叫乱码,乱码的文件夹可以删除。win10电脑文件名显示乱码的具体解决步骤。1、开始按钮>输入:控制面板 搜索得到文件后回车打开 控制面板;2、将查看方式修改 大图标。然后在下面点击【语言】;3、打开语言界面后在左侧点击【更改日期、时间额数字格式】;3、...
打印机乱码
软件解决方法;1.在BIOS设置里更改打印机并行口模式(如果你是使用传统的打印线而不是USB打印线的话),进入BIOS,“Integrated peripheral→parallel port mode”,有以下四种模式“SPP”(标准并行口)、“EPP”(增强并行口)、“ECP”(扩展并行口),“ECP+EPP”,如果你的打印机型号较老,则建议设...
手机收不到短信
若使用vivo手机,手机收不到短信,可以按以下方法排查:一、部分短信无法接收1、检查是否在骚扰信息拦截中设置了号码黑名单进入信息APP--右上角“圆圈图标”--骚扰信息拦截--黑名单管理--号码黑名单,如果号码被加入了黑名单,来电和信息将被拦截2、检查是否有第三方管家类软件对短信进行了拦截部分安全...
GVIM问题答疑【汇总贴】
【问题1】GVIM上状态机出现注释问题,Jsq Shixu等无异常。解决方法:重新安装GVIM,更改安装路径。【问题2】QUARTUS中中文注释显示乱码。解决方法:访问指定网址获取解决办法。【问题3】部分命令无效,涉及命令:Mdyjsq,MDYZTJ。解决方法:仔细检查安装步骤,确保按说明安装GVIM。注意文件mdy_plugin.vim保存在...
电脑xp系统下载官方地址哪里有xp系统下载
Windows XP Service Pack 2是什么? 这是保护基于 www.skycn.com\/soft\/14845.html 7. Windows XP Service Pack 2 支援工具 随着Windows XP SP2的发布,更多的新功能被开发出来,微 www.skycn.com\/soft\/19341.html 8. 解决Windows XP SP2乱码补丁 微软官方发布的解决SP2乱码的补丁... 授权: 免费 大小...
10659401半夜十二点给我发四个空白什么意思,感觉好吓人?
SP业务辨识与个人信息保护 10659401不是SP业务代码,发送验证短信到此号码不会导致订阅或扣费。测试SP业务最简单的方法是回复特定代码,如0000,如果收到回复,说明并未订阅相关服务。至于个人信息,短信内容主要涉及手机型号、制造商和SIM卡信息,不会泄露个人隐私。为何出现乱码或方块短信 如果你收到的...