解决中文乱码问题的超值方法
2007-06-13 08:46
489 查看
在使用ajax传递中文参数的时候,常常会因为编码方式的不同而出现乱码问题。
根据乱码出现的原因可以知道,只要调整编码方式,就可以解决乱码问题,比如在get或post方法里用request拿参数之前,设置一下编码方式,如:request.setCharacterEncoding("gb2312"),但是各个环境可能需要设置相应的编码方式,这让初学着感到杂乱无章;此外tomcat下编码方式默认是iso-8859-1,有时页面上使用的是utf-8,由于iso-8859-1两个字节一个汉字,utf-8是三个字节一个汉字,这个时候就会出现奇数汉字传值时最后一个汉字乱码。在这个情况下,另外一种解决中文乱码的方式相对而言就更直观,更让人容易接受,那就是使用escape/unescape(编码/解码)。
只要在传递参数前,将中文参数编码(如:pars=escape(pars)),传递完成之后再解码(如:pars=unescape(pars)),就可以得到传递的中文。
escape/unescape在javascript中有现成的方法,直接调用即可,而在服务器端的方法也很容易实现,下面就是escape/unescape在java中的实现:
//java中的escape方法的实现
public String unescape(String src){
StringBuffer tmp = new StringBuffer();
tmp.ensureCapacity(src.length());
int lastPos=0,pos=0;
char ch;
while (lastPos<src.length()){
pos = src.indexOf("%",lastPos);
if (pos == lastPos){
if (src.charAt(pos+1)=='u'){
ch = (char)Integer.parseInt(src.substring(pos+2,pos+6),16);
tmp.append(ch);
lastPos = pos+6;
}else{
ch = (char)Integer.parseInt(src.substring(pos+1,pos+3),16);
tmp.append(ch);
lastPos = pos+3;
}
}else{
if (pos == -1){
tmp.append(src.substring(lastPos));
lastPos=src.length();
}else{
tmp.append(src.substring(lastPos,pos));
lastPos=pos;
}
}
}
return tmp.toString();
}
//java中的unescape方法的实现
public String escape(String src){
int i;
char j;
StringBuffer tmp = new StringBuffer();
tmp.ensureCapacity(src.length()*6);
for (i=0;i<src.length() ;i++ ){
j = src.charAt(i);
if (Character.isDigit(j) || Character.isLowerCase(j) || Character.isUpperCase(j))
tmp.append(j);
else
if (j<256){
tmp.append( "%" );
if (j<16)
tmp.append( "0" );
tmp.append( Integer.toString(j,16) );
}else{
tmp.append( "%u" );
tmp.append( Integer.toString(j,16) );
}
}
return tmp.toString();
}
根据乱码出现的原因可以知道,只要调整编码方式,就可以解决乱码问题,比如在get或post方法里用request拿参数之前,设置一下编码方式,如:request.setCharacterEncoding("gb2312"),但是各个环境可能需要设置相应的编码方式,这让初学着感到杂乱无章;此外tomcat下编码方式默认是iso-8859-1,有时页面上使用的是utf-8,由于iso-8859-1两个字节一个汉字,utf-8是三个字节一个汉字,这个时候就会出现奇数汉字传值时最后一个汉字乱码。在这个情况下,另外一种解决中文乱码的方式相对而言就更直观,更让人容易接受,那就是使用escape/unescape(编码/解码)。
只要在传递参数前,将中文参数编码(如:pars=escape(pars)),传递完成之后再解码(如:pars=unescape(pars)),就可以得到传递的中文。
escape/unescape在javascript中有现成的方法,直接调用即可,而在服务器端的方法也很容易实现,下面就是escape/unescape在java中的实现:
//java中的escape方法的实现
public String unescape(String src){
StringBuffer tmp = new StringBuffer();
tmp.ensureCapacity(src.length());
int lastPos=0,pos=0;
char ch;
while (lastPos<src.length()){
pos = src.indexOf("%",lastPos);
if (pos == lastPos){
if (src.charAt(pos+1)=='u'){
ch = (char)Integer.parseInt(src.substring(pos+2,pos+6),16);
tmp.append(ch);
lastPos = pos+6;
}else{
ch = (char)Integer.parseInt(src.substring(pos+1,pos+3),16);
tmp.append(ch);
lastPos = pos+3;
}
}else{
if (pos == -1){
tmp.append(src.substring(lastPos));
lastPos=src.length();
}else{
tmp.append(src.substring(lastPos,pos));
lastPos=pos;
}
}
}
return tmp.toString();
}
//java中的unescape方法的实现
public String escape(String src){
int i;
char j;
StringBuffer tmp = new StringBuffer();
tmp.ensureCapacity(src.length()*6);
for (i=0;i<src.length() ;i++ ){
j = src.charAt(i);
if (Character.isDigit(j) || Character.isLowerCase(j) || Character.isUpperCase(j))
tmp.append(j);
else
if (j<256){
tmp.append( "%" );
if (j<16)
tmp.append( "0" );
tmp.append( Integer.toString(j,16) );
}else{
tmp.append( "%u" );
tmp.append( Integer.toString(j,16) );
}
}
return tmp.toString();
}
相关文章推荐
- httpclient中文乱码问题解决方法(收藏)
- java 中解决中文乱码问题的方法(三法)
- jquery获取URL中参数解决中文乱码问题的两种方法
- Code::Blocks中文乱码问题的解决方法
- Ubuntu/Debian下JAVA 中文/图片中文字体乱码显示问题解决方法
- eclipse 中文注释乱码问题的解决方法
- jsp传参 servlet接收中文乱码问题的解决方法
- httpClient使用postMethod方法发送请求,携带参数并解决中文乱码问题
- Mysql 下中文乱码的问题解决方法总结
- 关于java web中get方法的解决中文乱码问题
- 解决web应用开发中中文乱码问题的常用办法(暂时只用过这些方法)
- php miniBB中文乱码问题解决方法
- Python BeautifulSoup中文乱码问题的2种解决方法
- MySQL字符集中文乱码终极解决方案和mysql查询中文问题解决方法[转贴]
- android studio在模拟器上的中文乱码问题解决方法
- JSP中文乱码问题解决方法小结
- JSP传递中文参数乱码问题的解决方法
- MFC用CStdioFile类读取中文文本时乱码问题的一种解决方法
- Serlvet中文乱码问题过滤器解决方法
- PHP向MYSQL插入中文乱码问题解决方法