关于字符编码与解码的几个问题,希望大家一起讨论!
提几个问题:
1.从JSP页面按get或post方式传递参数,到返回结果这个过程中,中文参数会被经过几次字符编码,具体经过哪些编码过程?
2.JSP页面设置的字符编码会对传递的参数进行编码吗?如JSP页面设置为:
- HTML code
<%@ page language="java" contentType="text/html; charset=GBK" pageEncoding="GBK"%>
那么在传递参数之前,会将参数先进行编码成GBK吗?
3.在参数传递到服务器这个过程中(tomcat),会进行几次URLEncoder.encode()编码和几次URLDecoder.decode()解码,并且 编码和解码的时候都采用什么字符编码格式?在传递的过程中是否也会使用new String(s.getBytes("GBK"), "UTF-8")这种方式进行转码或者其他方式进行转码?
4.如果在tomcat的server.xml文件的<Connector>中设置URIEncoding属性,是否会将所有请求进行一次编码,这样的话又是在什么地方进行解码的呢?URLEncoding这个属性设置与不设置的区别如何?
5.如下面代码中,如何再将乱码转换回汉字?
- Java code
String s = "中文"; try { s = new String(s.getBytes("GBK"), "UTF-8"); } catch (UnsupportedEncodingException e3) { e3.printStackTrace(); } System.out.println(s);
此时,s已经被转换为乱码,如何再将它转换回正常的汉字呢?
以上几个问题,我已经迷惑了好久,始终没有一个清晰的概念,希望大家一起讨论!希望了解的高人们能够给出一个清晰的回答,在参数传递这整个流程中,都经过了哪些关键的编码或转码?
如果有好的资料,也希望不吝分享!
[解决办法]
这是我以前在别的帖子上发的希望对大家有帮助
关于中文乱码问题的几点总结:
1、unicode,utf-8,gbk,gb2312等都是字符编码,是指怎么用字节来表示字符。
2、java使用的是unicode,此话的意思是指运行时java的char类型是一个unicode编码字符,占两个字节。
3、java原文件一般都是以本地字符编码存储在本地文件系统中的。
4、java类文件是以unicode编码存储在本地文件系统中的。
5、当从一个字节序列转化为一个字符串的时候,需要字符编码。
乱码问题一般就是发生在第5步,比如一个4字节iso8859-1编码的字节(如:a,b,c,d),如果使用正确的字符编码转化它将被转化为4个字符(a,b,c,d)占8个字节,如果使用gbk编码转化它将被转为2个字符,同时着两个字符肯定也不是合法的gbk字符(??),乱码也就产生了。
jsp中的乱码问题
1、首先说读取数据,web服务器接收请求时,接受到的是字节序列,转化为字符时就需要知道此字符序列的编码,才能正确转化。对于tomcat来讲,如果未指定则默认使用iso8859-1,而通常中文平台的编码是gb2312,所以就会产生乱玛。
2、 <%@ page contentType="text/html; charset=GBK" %>
着句的意思是设置http响应头,提示浏览器使用的字符编码,同时设置http响应(response)的字符编码。
3、对于tomcat的get请求,编码的处理是在server.xml的connctor的URIEncoding中指定的。
这是对乱码的总结。
支持楼主上面的这样的讨论帖子
[解决办法]
[解决办法]
有人说,乱码问题一直跟中国的程序员特别有缘,真是再同意不过了,不管是Struts,JSF,JSP,还是MySQL,Tomcat,全都或多或少有乱码的问题。
一般的做法有用Filter:
< filter >
< filter-name > Set Character Encoding </ filter-name >
< filter-class > org.springframework.web.filter.CharacterEncodingFilter </ filter-class >
< init-param >
< param-name > encoding </ param-name >
< param-value > GBK </ param-value >
</ init-param >
< init-param >
< param-name > ignore </ param-name >
< param-value > true </ param-value >
</ init-param >
</ filter >
< filter-mapping >
< filter-name > Set Character Encoding </ filter-name >
< url-pattern > *.do </ url-pattern >
</ filter-mapping >
< filter-mapping >
< filter-name > Set Character Encoding </ filter-name >
< url-pattern > *.jsp </ url-pattern >
</ filter-mapping >
< filter-mapping >
< filter-name > Set Character Encoding </ filter-name >
< url-pattern > *.html </ url-pattern >
</ filter-mapping >
< filter-mapping >
< filter-name > Set Character Encoding </ filter-name >
< url-pattern > *.htm </ url-pattern >
</ filter-mapping >
的,有用
<% request.setCharacterEncoding( " GBK " ); %>
的,还有用
<% @ page contentType = " text/html; charset=GBK " pageEncoding = " GBK " %>
的,还可以用
<% String name = new String(request.getParameter( " name " ).getBytes( " 8859_1 " ), " GB2312 " ); %>
在做项目的过程中,发现用URL传request参数的时候,在第二个页面上得到乱码的问题。把上面几种方法都试了一下还是不行。仔细追踪了一下,发现在页面的源代码上中文是正常的,一直到URL还是中文正常,可是在后台的Action里面log出来就成了乱码了,于是猜想是在request封装的过程中把中文变成乱码了,以致于后台直接就是取到的乱码。在后台Action中Set入中文,页面上正常显示,说明Struts的中文已经不存在问题。剩下的,应该就只有doGet和doPost方法的问题了。找了一下tomcat的配置文件,发现只要在server.xml中:
<!-- Define a non-SSL HTTP/1.1 Connector on port 8080 -->
< Connector port ="8080" maxHttpHeaderSize ="8192"
maxThreads ="150" minSpareThreads ="25" maxSpareThreads ="75"
enableLookups ="false" redirectPort ="8443" acceptCount ="100"
connectionTimeout ="20000" disableUploadTimeout ="true" />
<!-- Note : To disable connection timeouts, set connectionTimeout value
to 0 -->
改为
<!-- Define a non-SSL HTTP/1.1 Connector on port 8080 -->
< Connector port ="8080" maxHttpHeaderSize ="8192"
maxThreads ="150" minSpareThreads ="25" maxSpareThreads ="75"
enableLookups ="false" redirectPort ="8443" acceptCount ="100"
connectionTimeout ="20000" disableUploadTimeout ="true" URIEncoding ="GBK" />
<!-- Note : To disable connection timeouts, set connectionTimeout value
to 0 -->
就是加上URIEncoding="GBK"就万事大吉了。
至此,应该再困难的乱码问题都解决了吧。就是要在页面上、数据库中、request里、doGet、doPost方法里面都是中文!
[解决办法]
sf?
[解决办法]
[解决办法]
问几个问题:
一、.java文件的字符集编码会对文件中的字符串产生影响吗?
二、String s = "abc"; 这里的abc的字符集是跟操作系统的字符集编码一致还是JVM的?
三、如何将servlet的response.getWriter().print(xml);输入的到界面的字符集改成UTF-8,以前遇到过的,怎么转换最后还是ANSI的(就是在页面点查看源代码,然后另存为可以看见当前的字符集编码格式)
[解决办法]
的确比较全面的编解码问题,我的理解:
1.无论是post还是get都是按页面的编码进行提交,即pageEncoding。如果pageEncoding属性存在,那么JSP页面的字符编码方式就由pageEncoding决定,否则就由contentType属性中的charset决定;如果charset也不存在,JSP页面的字符编码方式就采用默认的ISO-8859-1。后台处理完成后以charset设定的编码方式返回给JSP页面。
未设定时,pageEncoding和charset默认都是ISO-8859-1。
2.第一个问题中已经说清楚了,在程序里获取的参数就是以pageEncoding方式编码的内容。
3.除非你手动调用,否则不会进行URLEncoder.encode()或URLDecoder.decode(),具体过程还是见第一个问题。
4.如果设置了过滤器,只能对post方式提交的数据自动转码;如果在server.xml中设置了URIEncoding,只能对get方式提交数据自动转码。如果这两项都没有设置,需要时可以手动进行转码。
5.s = new String(s.getBytes("UTF-8"), "GBK");即可。
[解决办法]
------解决方案--------------------
数据库的字符集会对程序产生什么影响?
数据库用的字符集不同,rs.getString("")取出来的字符串是跟什么有关?
不同字符集拼接在一起,会不会有影响?
[解决办法]
如果在<%@ page language="java" contentType="text/html; charset=GBK" pageEncoding="GBK"%>
中指定pageEncoding="GBK",页面输入框输入的数据将被编码成GBK,发送的时候将以GBK的编码发送,
而如果指定contentType="text/html; charset=GBK",这是指定浏览器显示网页内容的编码,
如果在tomcat的server.xml文件的 <Connector>中设置URIEncoding属性,那么所有tomcat收到的数据都将以URIEncoding指定的编码进行编码,个人见解!
[解决办法]
- Java code
InputStream ins = rs.getBlob("XXX").getBinaryStream();for(int i = 0; (data = ins.read()) != -1; i++){ bytes[i] = (byte)data;}String sContent = new String(new String(bytes,"GBK").getBytes("UTF-8"),"UTF-8");
[解决办法]
乱码问题一般都是在传递过程中产生的。
一般可以归为以下几个过程:
1、页面到后台代码
2、后台代码到页面(常见)
3、后台到数据库(常见)
根据不同的过程产生乱码的现象,可以根据不同的方式来解决
譬如:
1、页面到后台,可以用如下方式
s = request.getParameter("");
s = new String(s.getBytes("GBK"), "UTF-8");
2、后台到页面
例如:response.setCharacterEncoding("UTF-8");
3、这种情况比较容易解决,可以设置数据库为gbk格式或utf8格式
utf8和utf-8是不同的,前者是数据库的,而后者是用于网页的编码格式
然后,在进行持久化操作之前,将要存储的数据转码,参考第一条。
[解决办法]
mark
[解决办法]
[解决办法]
你可以自己试一下,慢慢体会!
[解决办法]
同意三楼的!
记得有个强人就跟我们讲过关于乱码的问题
其中就提到了
在做项目的过程中,发现用URL传request参数的时候,在第二个页面上得到乱码的问题。把上面几种方法都试了一下还是不行。仔细追踪了一下,发现在页面的源代码上中文是正常的,一直到URL还是中文正常,可是在后台的Action里面log出来就成了乱码了,于是猜想是在request封装的过程中把中文变成乱码了,以致于后台直接就是取到的乱码。在后台Action中Set入中文,页面上正常显示,说明Struts的中文已经不存在问题。剩下的,应该就只有doGet和doPost方法的问题了。找了一下tomcat的配置文件,发现只要在server.xml中:
<!-- Define a non-SSL HTTP/1.1 Connector on port 8080 -->
< Connector port ="8080" maxHttpHeaderSize ="8192"
maxThreads ="150" minSpareThreads ="25" maxSpareThreads ="75"
enableLookups ="false" redirectPort ="8443" acceptCount ="100"
connectionTimeout ="20000" disableUploadTimeout ="true" />
<!-- Note : To disable connection timeouts, set connectionTimeout value
to 0 -->
改为
<!-- Define a non-SSL HTTP/1.1 Connector on port 8080 -->
< Connector port ="8080" maxHttpHeaderSize ="8192"
maxThreads ="150" minSpareThreads ="25" maxSpareThreads ="75"
enableLookups ="false" redirectPort ="8443" acceptCount ="100"
connectionTimeout ="20000" disableUploadTimeout ="true" URIEncoding ="GBK" />
<!-- Note : To disable connection timeouts, set connectionTimeout value
to 0 -->
就是加上URIEncoding="GBK"就万事大吉了。
这个办法是经过了他们公司所有技术强人所讨论出来的结果!
我相信三楼的朋友,也不会是外人吧!
[解决办法]
#include <stdio.h>
#include <stdlib.h>
#define SIZE 4
struct Job_type
{
int no; //作业号
int tb; //作业开始时间(分)
int tr; //运行时间(分)
} x;
struct Job_type job[]={1,0,70,2,20,20,3,40,40,4,30,5}; //此数据适合FCFS
//Job_type job[]={1,0,70,2,0,20,3,0,40,4,0,5}; //此数据适合SJF
void load()
{ int i;
//printf("\nEnter the Jobs' datas:\n");
//for(i=0;i<SIZE;i++)
//scanf("%d,%d,%d",&job[i].no,&job[i].tb,&job[i].tr);
printf("输入作业顺序:\n");
for(i=0;i<SIZE;i++)
printf("\t%d\t%d\t%d\n",job[i].no,job[i].tb,job[i].tr);
}
void fcfs()
{ int i,j,t=0,tw=0,tt=0;
for(i=0;i<SIZE-1;i++)
for(j=i+1;j<SIZE;j++)
if(job[i].tb>job[j].tb)
{x=job[i];
job[i]=job[j];
job[j]=x;
}
printf("FCFS调度结果:\n");
printf("开始时间 作业号 到达时间 运行时间 完成时间 等待时间 周转时间\n");
for(i=0;i<SIZE;i++)
{
printf(" %d",t);
t=t+job[i].tr;
tw=t-job[i].tb-job[i].tr; //作业等待时间
tt=t-job[i].tb; //周转时间
printf("\t%d\t%d\t%d\t%d\t%d\t%d\n",job[i].no,job[i].tb,job[i].tr,t,tw,tt);
}
}
void sjf() //短作业调度函数
{ int i,j,t=0,tw=0;
for(i=0;i<SIZE-1;i++)
for(j=i+1;j<SIZE;j++)
if(job[i].tr>job[j].tr)
{x=job[i];
job[i]=job[j];
job[j]=x;
}
printf("短作业优先调度结果:\n");
printf("开始时间 作业号 到达时间 运行时间 总时间 等待时间\n");
for(i=0;i<SIZE;i++)
{
printf(" %d",t);
t=t+job[i].tr;
tw=t-job[i].tb-job[i].tr; //作业等待时间
printf("\t%d\t%d\t%d\t%d\t%d\n",job[i].no,job[i].tb,job[i].tr,t,tw);
}
}
void main()
{
load();
fcfs();
sjf();
}
[解决办法]
学习学习哦。
[解决办法]
更正1楼的一个说法:
1、unicode,utf-8,gbk,gb2312等都是字符编码,是指怎么用字节来表示字符。
utf-8是unicode字符集外部交互的实现方式之一,unicode是字符集.
utf-8就是Unicode字符集转换格式:8 Bit Universal Character Set/Unicode Transformation Format).(或者8Bit放后面? 这个我不确定)
java采用的是modified UTF-8(与UTF-8不同)作为内部文本编码,I/O采用标准UTF-8,对象序列化支持非标准UTF-8.但是字符编码是统一的unicode字符集并且基于JVM和操作系统无关.
页面无论采用utf-8还是utf-16,都能和java直接交互无须转码,因为UTF-x虽然实现不同,但是都基于unicode字符集.
unicode,gbk,gb2312,big5,SJIS都是字符集,不过由于最全面的字符集unicode同其他字符集交互(目前unicode最常用的USC-2,也就是2字节编码)在控制符方面可能会引入严重的错误,比如"号,所以unicode字符集和其他字符集交互,需要通过utf-x的新编码方式来保证准确性.
也就是说某个数据以unicode字符集格式存在,但是为了和其他字符集交互,它实际的保存形式是以utf-x的方式存在的.
某猫呆过的公司都统一所有项目/数据库/页面文件等等为utf-8格式,来解决乱码问题,所以并不熟悉过滤和转码.
以上是某猫一直的理解,不过没有详细的考究过,所以不能保证都正确喵~~``
[解决办法]
[解决办法]
[解决办法]
我想拿个分 感谢人
[解决办法]
mark it
[解决办法]
.java文件的编码是可以自己设定的,在开发工具里就可以设,我的默认的是GBK,换成UTF-8后,用ANT编译还要多加上一个编码属性encoding="utf-8"才能编译成功,反之是GBK的,加了属性也不会编译成功
[解决办法]
帮顶了!
[解决办法]
~~
顶
[解决办法]
[解决办法]
asdfasdf
[解决办法]
这个很有用,mark
[解决办法]
- Java code
String temp1 = "汉字";String temp2 = new String(temp1.getBytes("gbk"),"utf-8"); //乱码String temp3 = new String(temp2.getBytes("utf-8"),"gbk"); //乱码 -1String temp1 = "汉字";String temp2 = new String(temp1.getBytes("utf-8"),"utf-8"); //乱码String temp3 = new String(temp2.getBytes("gbk"),"utf-8"); //正常String temp4 = new String(temp1.getBytes("utf-8"),"utf-8"); //正常String temp4 = new String(temp1.getBytes("GBK"),"GBK");// 正常String temp4 = new String(temp1.getBytes("iso-8859-1"),"iso-8859-1"); //乱码 -2
[解决办法]
上面,更正一下
- Java code
String temp1 = "汉字";String temp2 = new String(temp1.getBytes("gbk"),"utf-8"); //乱码String temp3 = new String(temp2.getBytes("utf-8"),"gbk"); //乱码 -1String temp2 = new String(temp1.getBytes("utf-8"),"gbk"); //乱码String temp3 = new String(temp2.getBytes("gbk"),"utf-8"); //正常String temp4 = new String(temp1.getBytes("utf-8"),"utf-8"); //正常String temp4 = new String(temp1.getBytes("GBK"),"GBK");// 正常String temp4 = new String(temp1.getBytes("iso-8859-1"),"iso-8859-1"); //乱码 -2
[解决办法]
顶一下
[解决办法]
[解决办法]
[解决办法]
- Java code
public class Test{ public static void main(String[] args) throws UnsupportedEncodingException { String temp1 = "汉字"; byte[] bytes = temp1.getBytes("gbk"); String temp2 = new String(bytes,"utf-8"); String temp3 = new String(bytes,"gbk"); System.out.println(temp1); System.out.println(temp2);//乱码 System.out.println(temp3);//乱码....才怪喵~`` }}
[解决办法]
我一般用过滤器解决
[解决办法]
我来顶下
[解决办法]
请解释下这个为什么正常
String temp1 = "汉字";
String temp2 = new String(temp1.getBytes("utf-8"),"gbk"); //乱码
String temp3 = new String(temp2.getBytes("gbk"),"utf-8"); //正常
[解决办法]
mark!
[解决办法]
字符编码一直是很让人头痛的问题
[解决办法]
如果是框架有spring框架的话3楼的是可以我今天就这么做,不过如果没有这框架的话找一个字符编码的类,然后同样在web.xml配置一下过滤器就可以了!
[解决办法]
up,学习
[解决办法]
[解决办法]
至于楼主的问题,我觉得你开发的东西应该一致,如果你不了解各种开发使用的默认的字符编码,那你就强制的明确指定。
不过我还是觉得上面介绍的过滤器是一种很好的解决方案!
[解决办法]
已经有好的答案哦,你慢慢试一试吧····
鼎······
[解决办法]
MARK!
[解决办法]
帮顶!
[解决办法]
顶
[解决办法]
虽然头有点大,还是学习了
[解决办法]
1.从JSP页面按get或post方式传递参数,到返回结果这个过程中,中文参数会被经过几次字符编码,具体经过哪些编码过程?
会经过两次吧..一次是获取传递的参数一次编码过程..还有一次是返回响应页面也要经过一次编码过程
2.JSP页面设置的字符编码会对传递的参数进行编码吗?如JSP页面设置为:
不会
3.编码的处理是在server.xml的connctor的URIEncoding中指定的
[解决办法]
先顶一下,再过来看
[解决办法]
好帖,顶
[解决办法]
mark
[解决办法]
有人在吗???
[解决办法]
最后还是没个结论,继续讨论!up
[解决办法]
5.如下面代码中,如何再将乱码转换回汉字?
String s = "中文";
try {
s = new String(s.getBytes("GBK"), "UTF-8");
} catch (UnsupportedEncodingException e3) {
e3.printStackTrace();
}
System.out.println(s);
很可能转不回了,你吧GBK的编码的4个字节当成UTF-8读,读晚之后肯定出错,也就是乱码,但是即使出错程序也强行把那个乱码当成“正常”的字符串存在String里面。如果这个“正常”的字符串的UTF-8的编码和原来那个初试输出的字符串的GBK编码时一样的话(也就是刚才的出错很巧合地没有损失数据),那么再进行一次String(s.getBytes("UTF-8"), "GBK");或许可以成功。
你出错的地方在于String(s.getBytes("GBK"), "UTF-8");并不是把string的编码方式改变了,Java内部String的编码方式是永远不会变的,你指定的字符集、或编码方式只是改变其内部字符串输出到外部字节流或从外部字节流读取时候的行为。
[解决办法]
sf?
[解决办法]
up
[解决办法]
这么多人都在说自己的看法了,其实大家说的都对,关键是能在实际的开发中灵活的运用这才是最重要的。总结下了哦!
[解决办法]
我自己的解决方法:new String(request.getParameter("").getBytes("iso8859-1"),"utf-8")
前边iso8859-1那里不能动。后边utf-8可以换成gbk或gb2312,在linux下应该是utf-8,windows下应该是gb2312,不过个人建议还是改成utf-8统一一点的好。
还有一个办法就是三楼说的:在server.xml的文件里边添加上:URIEncoding="utf-8/或gb2312等",这样做后,对get方式的提交直接读出来就OK了,然后在写一个过滤器。过滤所有的页面。 写:response.setCharsetEncoding("utf-8/或gb2312等"),这个对post方式的解码有效
[解决办法]
果然是搞研究的。。。
颁发你个硕士学位
[解决办法]
niu 厉害厉害
[解决办法]
怎么还没加分?
[解决办法]
最近刚好碰到这个问题:用request.getParameter 取的的参数乱码;
之前用new String(request.getParameter("").getBytes("iso8859-1"),"utf-8") 等多种编码格式转都不成功;
js中是采用post方式提交的;提交的时候设置:objXMLHTTP.setRequestHeader("charset","utf-8");
JSP页面设置<%@ page language="java" contentType="text/html; charset=GB18030" pageEncoding="GB18030"%>
web.xml设置过滤器编码格式是GBK;
发现乱的很,实在不清楚是怎么个编码过程,后面是这样解决的:
js:
name=encodeURI(name);//转为UTF-8——如果js中没有进行encodeURI编码action怎么转都无法把中文正常显示;
action:
String name =request.getParameter("name")==null ?"":request.getParameter("name");
name =URLDecoder.decode(name, "UTF-8"); //UTF-8 反编码
[解决办法]
builder it
[解决办法]
这个东西,我不懂的
不好意思
[解决办法]
这可真是个问题呀。。
下面是我以前163blog 上的一篇日质,希望对LZ有用,文章地址:http://xinming1558.blog.163.com/blog/edit/
第一,存文件必须以一种编码存;读文件也必须以一种编码读,如不特别设置,去系统默认的编码,中文windows为GBK编码。
从.java->.class过程是,先编写.java文件并按莫种编码方式保存,然后用javac方法编译此文件,注意如.java没按系统默认编码保存则要带encoding参数指明实际编码,否则出错,生成的.class文件存为系统默认编码。
从.jsp->.java->.class,先存为某种编码的.jsp文件,然后tomcat根据pageEncoding读取并转化为servlet存为系统默认编码,然后同上面.java->.class过程。
第二,IDE的encoding为对系统下文件打开的解码方式或保存的编码方式。特例:如果.jsp文件有<%@ page language="java" pageEncoding="UTF-8"%>,则eclipse会自动存为UTF-8方式,不管eclipse的encoding是什么,这也是eclipse的聪明之处。
第三,
pageEncoding="UTF-8"表示此文件的编码方式,必须与此文件存储方式一致(所以eclipse会首选根据它来存文件),tomcat根据这个来读此.jsp文件并编译为servlet。
contentType="text/html;charset=UTF-8"表示当浏览器得到此文件时以什么方式解码。例如:
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ page contentType="text/html;charset=iso8859-1"%>
<html>
<head>
<title>test</title>
</head>
<body>
我是个好人
</body>
</html>
会产生乱码,因为存为UTF-8的文件被解码为iso8859-1,这样 如有中文肯定出乱码。
至此,页面应为:
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ page contentType="text/html;charset=UTF-8"%>
<html>
<head>
<title>中文问题</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
</html>
第四,
request.setCharacterEncoding("UTF-8")是把提交内容的字符集设为UTF-8
response.setCharacterEncoding("UTF-8")可以把页面中的<%@ page contentType="text/html;charset=iso8859-1"%>换为charset=UTF-8,是给告诉浏览器我这个文件的编码方式。
第五,表单提交:无论何种表单提交都可以在后台的java文件中通过String des = new String(s.getBytes("iso8859-1"),"UTF-8");来转换成你想要的UTF-8编码方式。但如果每处都加词句太麻烦,故分post和get两种方式区分提交(tomcat5以后分开处理,之前处理方式一样,即都可以用request.setCharacterEncoding("UTF-8")方法处理,不过tomcat5以后get提交方法用此语句无效)。
1,post提交的数据:
程序加上org.springframework.web.filter.CharacterEncodingFilter过滤器.
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>*.html</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
因为规范要求浏览器提交数据都要用utf8编码,所以这里设置编码方式为UTF8.
特别注意:
a,这个过滤器只是简单的调用:request.setCharacterEncoding(this.encoding);
在这个语句之前不能调用任何的request.getParameter()方法,否则会设置tomcat的缺省字符集为"ISO-8859-1",并且使setCharacterEncoding的调用失效.所以在这个过滤器之前的过滤器中不能有对getParameter这类方法的调用,比较安全的做法就是把这个过滤器尽量靠前放.
b,在server.xml中不能加上<Valve className="org.apache.catalina.valves.RequestDumperValve"/>
这个value也设置tomcat的缺省字符集为"ISO-8859-1",使setCharacterEncoding的调用失效.可能其他的value也有这个问题,我没有测试过.
如果要观察http请求参数,可以考虑用过滤器或者其他工具,例如ethereal(http://www.ethereal.com/)
2,get提交的数据:
两种情况:
a,如果从地址栏直接输入汉字,则一般编码为"GBK",需要用
new String(request.getParameter("something").getBytes("ISO-8859-1"),"GBK")
取出
b,如果是页面超连接连接中带的汉字,则编码根据页面编码的不同而不同,如果页面的
content="text/html; charset=utf-8",则在tomcat/conf/server.xml中的配置文件中:
<!-- Define a non-SSL Coyote HTTP/1.1 Connector on port 8080 -->
<Connector port="8080"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
debug="0" connectionTimeout="20000" useBodyEncodingForURI="true"
disableUploadTimeout="true" />
加上:useBodyEncodingForURI="true"即可正常使用getParameter取出正确内容.
如果content="text/html; charset=GBK",需用
new String(request.getParameter("something").getBytes("ISO-8859-1"),"GBK")
取出,其他情况类似.
总结:
1,所有页面使用utf8编码,
2,服务器加上过滤器,
3,server.xml中不要使用
<Valve className="org.apache.catalina.valves.RequestDumperValve"/>
4,server.xml文件加上useBodyEncodingForURI="true"
这样应该可以搞定大多数前台的中文问题.至于地址栏输入中文,不支持也罢,一般的程序很少要求
从这里输入.
第六,连接数据库
1、mysql配置文件:
修改mysql在windows\my.ini里default-character-set=utf-8
2、mysql里数据库和表也都设为utf8_unicode_ci
3、数据库连结:jdbc:mysql://localhost/mydb?useUnicode=true&characterEncoding=utf-8
注意,关键就在于此:此句中间是'&'不是'&'这是因为数据库连结时,在.jsp和.java文件中应该用&号,而XML文件中需要用&
[解决办法]
确实存在这样的问题
[解决办法]
mark,学习了
[解决办法]
学习啦,我在做的时候,一般把所有的页面都设置utf-8的编码,写的过滤器也是,所以没有出现过乱码的情况,而且运行也没出现问题
[解决办法]
就解决方法来说 3楼和82楼基本都可以解决
[解决办法]
大家的回答好积极啊!
字符--> bytes,编码,
bytes --> 字符, 解码
GBK UTF8 等是不同的“-->” 映射。
[解决办法]
学习了!
[解决办法]
不错的贴学习了不少
[解决办法]
很好,收藏啦
[解决办法]
mark
[解决办法]
ding
[解决办法]
学习
[解决办法]
学习了
[解决办法]
繁和简体编码是不一样,之间有会有什么不同呢?
[解决办法]
谢谢楼主,关注一下
[解决办法]
javaWeb开发当中遇到的乱码问题还是十分简单的:
1、设置tomcat connect的URIEncoding=“GBK”可解决get提交中文参数乱码
2、加filter可解决post提交中文参数乱码,、这个filter很简单可以自己写也可以用spring的、spring净干这事
3、一般项目jsp页面指定编码GBK、实际上等效于response.setCharSet("GBK")好像是这么写...所以当你没有返回jsp页面而是用response直接输出到客户端时应该额外指定response.setCharSet("GBK")
4、比较少见的是遇到数据库非中文编码,数据库安装时会自动采用本机操作系统的编码,如果不巧是iso-8859-1,那么只能是所有查询出的转一下、插入的转一下...用new String(s.getBytes("GBK"), "UTF-8");这种的即可
其他的就没什么了
但是遇到asc2、字节处理还是很麻烦,搞不透。
[解决办法]
学习。