(网络收集)彻底解决超链接提交中文乱码问题

即便是把页面和项目的编码都统一设置为UTF-8,但由于tomcat的编码是ISO-8859-1,再处理中文URL时,还是会报错,这里最简单的办法,莫过于把tomcat的编码统一为UTF-8,即在server.xml中将如下的语句中添加最后一句,即:URIEncoding="UTF-8"

<Connector port="8080" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="UTF-8" />

但是由于在tomcat编码是ISO-8859-1的情况下,form表单以post提交的action,并不会报中文乱码的错误。故可用js做如下转换:

<a href='./servlet/MyServlet?name=世界&id=1' οnclick="return linkClick(this)">click me</a> <br>

如上有中文的超级链接,将其转化为一个form并且以post方式提交则也不会报错:
function linkClick(linkObject) {

var formObject = document.createElement('form');
document.body.appendChild(formObject);
formObject.setAttribute('method', 'post');
var url = linkObject.href;
var uri = '';
var i = url.indexOf('?');

if(i == -1) {
formObject.action = url;
} else {
formObject.action = url.substring(0, i);
}

if( i >= 0 && url.length >= i + 1) {
uri = url.substring(i + 1, url.length);
}

var sa = uri.split('&');

for(var i = 0; i < sa.length; i++) {
var isa = sa[i].split('=');
var inputObject = document.createElement('input');
inputObject.setAttribute('type', 'hidden');
inputObject.setAttribute('name', isa[0]);
inputObject.setAttribute('value', isa[1]);
formObject.appendChild(inputObject);
}

formObject.submit();

return false;
}

至于post提交中文不乱码而get提交中文会乱码.原因如下:

原来,get提交后是不会经过filter过滤的。如果要get提交中文不乱满,就在server.xml文件中Connector节点加上 URIEncoding="GBK",默认的如果没有URIEncoding的话,会使用ISO-8859-1的字符集的。还有一个方法是:tomcat的connector元素中另外提供了useBodyEncodingForURI参数,其值为boolean型,true代表使用处理body的encoding方法(即request.setCharacterEncoding)来处理URI的编码,这样就可以用一个过滤器来同时处理post和get方法了。
具体详见论坛帖子:
http://www.iteye.com/topic/187949

另外判断一个字符串是不是某种编码,可以用如下方式:

String encode = "ISO-8859-1";
try {
if (str.equals(new String(str.getBytes(encode), encode))) {
String s1 = encode;
return s1;
}
} catch (Exception e) {
e.printStackTrace();
}

转码可用:

if(str!=null){
try {
str=new String(str.getBytes("ISO-8859-1"),"UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值