关于不常用汉字后台出现乱码的问题 gbk,gbk2312,iso8859-1,utf-8等编码都不行??? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你可以试试post可以吗?没有遇到过,个人感觉通过get的话,经过转码应该不会有问题啊,没有遇到过幫頂 如果在JSP页面显示正常的话,在页面间传递才有错,那我们先做个实验来看看是“由于汉字不常用才出错,还是因为转码转错的原因。”,你说用gbk,gb2312来转都不行,如果把字符串“埗,哈哈”传到下一个页面,是三个字都乱码还是只有"埗"乱码呢? 用GBK或者utf-8如果用post方式在获取参数的前面加一句:request.setCharacterEncoding("GBK");如果用get方式的话,就要转码才行 谢谢各位,首先一个问题是,常用汉字都没问题,问题就是出在不常用汉字上,但jsp页面通过gbk转换后这些字也就没问题了;request.setCharacterEncoding("GBK");方法也试过,也不行,各位如果方便的话,可以拿“埗”拷去本地试一下,这个字一般的输入法是打不出来的,再次感谢各位 谢谢terry_yip(搞了几年开发,现在才来恶补基础,请别见笑!) ;常用汉字放在“埗”之前那些常用汉字就没问题,但在之后就会受影响,如“埗哈哈”,就会全部乱码,但“哈哈埗”的话,“哈哈”不会是乱码,但“埗”还会是乱码 把<meta http-equiv="Content-Type" content="text/html; charset=utf-8">也改成gbk1.在传参数之前先把参数进行转码: request.setEnco..("gbk");2.在你的Tomcat目录-->conf目录-->server.xml里找出这段: <Connector port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" debug="0" connectionTimeout="20000" disableUploadTimeout="true" <!--在里边加上这个参数-->URIEncoding="gbk" /> 写一个自己的MyActionServlet来继承org.apache.struts.action.ActionServlet同时只需要 重写 里面的两个方法 doGet(HttpServletRequest arg0,HttpServletResponse arg1){arg0.setCharacterEncoding("gbk");arg1.setCharacterEncoding("gbk");return.....} 和doPost(HttpServletRequest arg0,HttpServletResponse arg1){arg0.setCharacterEncoding("gbk");arg1.setCharacterEncoding("gbk");return.....}如何把项目下的 web.xml里的<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>改成<servlet-class>yourpackagename.MyActionServlet</servlet-class>当然每个jsp页面都应该有<%@ page contentType="text/html; charset=GBK"%>你试试看 应该没问题了!:) 楼主,我复制你的那"埗哈哈",在Tomcat5.0下面试了,没问题,这是我做的三个页面:------------test.jsp----------------------------<%@ page language="java" contentType="text/html; charset=GBK" pageEncoding="GBK"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><meta http-equiv="Content-Type" content="text/html; charset=GBK"><title>Insert title here</title></head><body>埗哈哈<%String s="埗哈哈";%><%=s%><A HREF="get.jsp?s=<%=s%>">get方式提交</A><BR><BR><FORM METHOD=POST ACTION="post.jsp" method="post"><INPUT TYPE="text" NAME="s" value="<%=s%>"><INPUT TYPE="submit" value="post方式提交"></FORM></body></html>----------------post.jsp---------------------------<%@ page language="java" contentType="text/html; charset=GBK" pageEncoding="GBK"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><meta http-equiv="Content-Type" content="text/html; charset=GBK"><title>Insert title here</title></head><body>埗哈哈<%//request.setCharacterEncoding("GBK");//out.println("handle by request.setCharacterEncoding:"+request.getParameter("s")+"<BR>");out.println("handle by GBK():"+GBK(request.getParameter("s"))+"<BR>");out.println("no handling:"+request.getParameter("s")+"<BR>");%><%!public static String GBK(String s){ try { String des=new String(s.getBytes("iso8859-1"),"GBK"); return des; } catch(Exception ex) { String des=""; return des; }}%></body></html>-----------------------------get.jsp--------------------------<%@ page language="java" contentType="text/html; charset=GBK" pageEncoding="GBK"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><meta http-equiv="Content-Type" content="text/html; charset=GBK"><title>Insert title here</title></head><body>埗哈哈<%//request.setCharacterEncoding("GBK");//out.println("handle by request.setCharacterEncoding:"+request.getParameter("s")+"<BR>");out.println("handle by GBK():"+GBK(request.getParameter("s"))+"<BR>");out.println("no handling:"+request.getParameter("s")+"<BR>");%><%!public static String GBK(String s){ try { String des=new String(s.getBytes("iso8859-1"),"GBK"); return des; } catch(Exception ex) { String des=""; return des; }}%></body></html>注意,你要看看你的jsp保存时,是保存为什么格式的,用默认的就不会有问题了,很多人都不知道JSP的保存格式不对会造成乱码的。 中文乱码问题原理及解决方案1.中文乱码原理contentType -- 指定的是JSP页最终Browser(客戶端)所見到的网页內容的编码。就是 Mozilla的 Character encoding, 或者是 IE6的 encoding. 例如 JSPtw Forum 用的contentType就是 Big5. pageEncoding -- 指定JSP编写时所用的编码如果你的是 WIN98, 或 ME 的NOTEPAD记事本JSP, 就一定是常用的是Big5 或 gb2312, 如果是用 WIN2k winXP的NOTEPAD時, SAVE时就可以选择不同的编码, 包括 ANSI(BIG5/GB2312)或 UTF-8 或 UNIONCODE(估是 UCS 16). 因为JSP要经过两次的"编码", 第一阶段会用 pageEncoding, 第二阶段会用 utf-8 至utf-8, 第三阶段就是由TOMCAT出來的网页, 用的是contentType. 阶段一是 JSPC的 JSP至JAVA(.java)原码的"翻译", 它会根据pageEncoding 的设定读取JSP. 结果是 由指定的 pageEncoding(utf-8,Big5,gb2312)的JSP 翻译成统一的utf-8 JAVA原码(.java). 如果pageEncoding设定错了, 或沒设定(预设ISO8859-1), 出来的 在这个阶段就已是中文乱码. 阶段二是由 JAVAC的JAVA原码至JAVA BYTECODE的编译. 不论JSP的编写时是用(utf-8,Big5,gb2312),经过阶段一的结果全都是utf-8的ENCODING的JAVA原码. JAVAC用 utf-8的ENCODING读取AVA原码, 编译成字串是 utf-8 ENCODING的二进制码(.class). 這这是 JAVA VIRTUAL MACNHINE 对常数字串在 二进制码(JAVA BYTECODE)內表单的规范. 阶段三是TOMCAT(或其的application container)载入和执行 階段二得来的JAVA二进制码, 输出的结果( 也就是BROWSER(客戶端)) 見到的. 这时一早隐藏在階段一和二的参数contentType, 就发挥了功效.由上可知,1.如果在jsp页面里有中文,则在显示时不出现乱码,就要设置contentType为gbk,big5,gb2312或utf-8。2.在日文系统下,jsp页面里有中文,则不仅要设置contentType,还得设置pageEncoding为gbk,big5,gb2312,否则可能出现乱码。2.中文请求乱码原理默认情况下,浏览器使用utf-8发送请求,服务器(tomcat/webshere/weblogical等)接收请求默认使用的是utf-8。这时如果在java程序里处理中文就可能出现乱码。解决方案:request.setCharacterEncoding("gb2312");转换字符集后处理。3.struts中的中文问题Struts中,浏览器发送请求后, 在action里取值时,无论怎么转码都是乱码,不管用form.get,还是request.get方法。这是由于,form中的字段已经由struts将请求中的数据组装到form里了,此时已经为乱码,使用的字符集为服务器默认的字符集,所以在action里取值时,无论怎么转码都是乱码,不管用form.get,还是request.get方法解决方案:做一个过滤器,在请求到来时,让过滤器过滤请求编码字符集。public void doFilter(ServletRequest srequest, ServletResponse sresponse, FilterChain chain) throws IOException, ServletException{ srequest.setCharacterEncoding(“gb2312”); chain.doFilter(srequest,sresponse);} 谢谢各位的解答,但大家可能没有理解问题所在:现在问题是这样的,我用的是struts结构,在两个jsp页面之间都没问题,这个字也不会是乱码,但一到action不管是用 request.getParameter()方法还是form.get方法取出来的都是乱码,而且不管怎么转码都是一样,所以,jsp页面上的方法都不需要试了,jsp与action之间还有没有什么方法进行转码的 把字符串这样处理一下以后再取就没有问题了String str = request.getParameter("userName");byte B[] = str.getBytes("ISO-8859-1");str = new String(B); 你是用Tomcat发布的工程吗?解决方法:1.写一个过滤器,过滤所有页面,Action或Servlet request.setCharacterEncoding("GBK");response.setCharacterEncoding("GBK");2.用记事本打开Tomcat\conf\server.xml找到<Connector port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" debug="0" connectionTimeout="20000" disableUploadTimeout="true" <font color=red>useBodyEncodingForURL="true"</font>/>红色是要添加的。 用jUnit测试正确可是 用main方法测试就为空指针 有人了解J2EE框架jboss-seam吗,跟struts2比较一下 spring 方法增强的奇怪问题 spring自动调度问题,求指点 Java程序和在Oracle数据库中调用相同的SQL查询语句,结果却不相同 问一个关于Skype的问题(急!!!) struts2 s:file petstore怎样导入整合的jb8+weblogic7去 如何向action中传一个对象,求帮助! java中的http接口 急求把图片文件和文件信息转为一XML文件的方法 fileupload组件文件上传的疑难问题。。。紧急求助
如果用post方式在获取参数的前面加一句:
request.setCharacterEncoding("GBK");
如果用get方式的话,就要转码才行
也改成gbk1.在传参数之前先把参数进行转码: request.setEnco..("gbk");
2.在你的Tomcat目录-->conf目录-->server.xml里找出这段:
<Connector
port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
debug="0" connectionTimeout="20000"
disableUploadTimeout="true" <!--在里边加上这个参数-->URIEncoding="gbk"
/>
同时只需要 重写 里面的两个方法
doGet(HttpServletRequest arg0,HttpServletResponse arg1){
arg0.setCharacterEncoding("gbk");
arg1.setCharacterEncoding("gbk");
return.....
} 和doPost(HttpServletRequest arg0,HttpServletResponse arg1){
arg0.setCharacterEncoding("gbk");
arg1.setCharacterEncoding("gbk");
return.....
}如何把项目下的 web.xml里的
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
改成<servlet-class>yourpackagename.MyActionServlet</servlet-class>当然每个jsp页面都应该有<%@ page contentType="text/html; charset=GBK"%>你试试看 应该没问题了!
:)
------------test.jsp----------------------------<%@ page language="java" contentType="text/html; charset=GBK"
pageEncoding="GBK"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK">
<title>Insert title here</title>
</head>
<body>
埗哈哈
<%
String s="埗哈哈";
%>
<%=s%>
<A HREF="get.jsp?s=<%=s%>">get方式提交</A>
<BR><BR>
<FORM METHOD=POST ACTION="post.jsp" method="post">
<INPUT TYPE="text" NAME="s" value="<%=s%>">
<INPUT TYPE="submit" value="post方式提交">
</FORM>
</body>
</html>----------------post.jsp---------------------------
<%@ page language="java" contentType="text/html; charset=GBK"
pageEncoding="GBK"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK">
<title>Insert title here</title>
</head>
<body>
埗哈哈
<%
//request.setCharacterEncoding("GBK");
//out.println("handle by request.setCharacterEncoding:"+request.getParameter("s")+"<BR>");out.println("handle by GBK():"+GBK(request.getParameter("s"))+"<BR>");
out.println("no handling:"+request.getParameter("s")+"<BR>");
%><%!
public static String GBK(String s)
{
try
{
String des=new String(s.getBytes("iso8859-1"),"GBK");
return des;
}
catch(Exception ex)
{
String des="";
return des;
}
}%>
</body>
</html>-----------------------------get.jsp--------------------------
<%@ page language="java" contentType="text/html; charset=GBK"
pageEncoding="GBK"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK">
<title>Insert title here</title>
</head>
<body>
埗哈哈
<%
//request.setCharacterEncoding("GBK");
//out.println("handle by request.setCharacterEncoding:"+request.getParameter("s")+"<BR>");out.println("handle by GBK():"+GBK(request.getParameter("s"))+"<BR>");
out.println("no handling:"+request.getParameter("s")+"<BR>");
%>
<%!
public static String GBK(String s)
{
try
{
String des=new String(s.getBytes("iso8859-1"),"GBK");
return des;
}
catch(Exception ex)
{
String des="";
return des;
}
}%>
</body>
</html>注意,你要看看你的jsp保存时,是保存为什么格式的,用默认的就不会有问题了,很多人都不知道JSP的保存格式不对会造成乱码的。
1.中文乱码原理
contentType -- 指定的是JSP页最终Browser(客戶端)所見到的网页內容的编码。
就是 Mozilla的 Character encoding, 或者是 IE6的 encoding. 例如 JSPtw Forum 用的contentType就是 Big5. pageEncoding -- 指定JSP编写时所用的编码
如果你的是 WIN98, 或 ME 的NOTEPAD记事本JSP, 就一定是常用的是Big5 或 gb2312, 如果是用 WIN2k winXP的NOTEPAD時, SAVE时就可以选择不同的编码, 包括 ANSI(BIG5/GB2312)或 UTF-8 或 UNIONCODE(估是 UCS 16). 因为JSP要经过两次的"编码", 第一阶段会用 pageEncoding, 第二阶段会用 utf-8 至utf-8, 第三阶段就是由TOMCAT出來的网页, 用的是contentType. 阶段一是 JSPC的 JSP至JAVA(.java)原码的"翻译", 它会根据pageEncoding 的设定读取JSP. 结果是 由指定的 pageEncoding(utf-8,Big5,gb2312)的JSP 翻译成统一的utf-8 JAVA原码(.java). 如果pageEncoding设定错了, 或沒设定(预设ISO8859-1), 出来的 在这个阶段就已是中文乱码. 阶段二是由 JAVAC的JAVA原码至JAVA BYTECODE的编译. 不论JSP的编写时是用(utf-8,Big5,gb2312),经过阶段一的结果全都是utf-8的ENCODING的JAVA原码.
JAVAC用 utf-8的ENCODING读取AVA原码, 编译成字串是 utf-8 ENCODING的二进制码(.class). 這这是 JAVA VIRTUAL MACNHINE 对常数字串在 二进制码(JAVA BYTECODE)內表单的规范. 阶段三是TOMCAT(或其的application container)载入和执行 階段二得来的JAVA二进制码, 输出的结果( 也就是BROWSER(客戶端)) 見到的. 这时一早隐藏在階段一和二的参数contentType, 就发挥了功效.由上可知,
1.如果在jsp页面里有中文,则在显示时不出现乱码,就要设置contentType为gbk,big5,gb2312或utf-8。
2.在日文系统下,jsp页面里有中文,则不仅要设置contentType,还得设置pageEncoding为gbk,big5,gb2312,否则可能出现乱码。2.中文请求乱码原理
默认情况下,浏览器使用utf-8发送请求,服务器(tomcat/webshere/weblogical等)接收请求默认使用的是utf-8。这时如果在java程序里处理中文就可能出现乱码。
解决方案:request.setCharacterEncoding("gb2312");转换字符集后处理。
3.struts中的中文问题
Struts中,浏览器发送请求后, 在action里取值时,无论怎么转码都是乱码,不管用form.get,还是request.get方法。
这是由于,form中的字段已经由struts将请求中的数据组装到form里了,此时已经为乱码,使用的字符集为服务器默认的字符集,所以在action里取值时,无论怎么转码都是乱码,不管用form.get,还是request.get方法
解决方案:做一个过滤器,在请求到来时,让过滤器过滤请求编码字符集。
public void doFilter(ServletRequest srequest, ServletResponse sresponse,
FilterChain chain) throws IOException, ServletException
{
srequest.setCharacterEncoding(“gb2312”);
chain.doFilter(srequest,sresponse);
}
String str = request.getParameter("userName");
byte B[] = str.getBytes("ISO-8859-1");
str = new String(B);
解决方法:
1.写一个过滤器,过滤所有页面,Action或Servlet request.setCharacterEncoding("GBK");
response.setCharacterEncoding("GBK");2.用记事本打开Tomcat\conf\server.xml
找到<Connector
port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
debug="0" connectionTimeout="20000"
disableUploadTimeout="true" <font color=red>useBodyEncodingForURL="true"</font>/>
红色是要添加的。