zoukankan      html  css  js  c++  java
  • (网络收集)彻底解决超链接提交中文乱码问题

    即便是把页面和项目的编码都统一设置为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' onclick="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(); 


       

  • 相关阅读:
    [CSP校内集训]hotel
    DP小技巧——悬线法
    [SDOI2015]寻宝游戏/异象石(LCA)
    [HAOI2006]旅行
    [SDOI2013]泉(搜索+hash+容斥)
    [NOIP校内集训]home
    [AHOI2014/JSOI2014]骑士游戏(SPFA的本质)
    欧拉函数模板
    开学考试题8:神奇的集合(multiset) 动态开点线段树
    开学考试题5:2017黑龙江省选
  • 原文地址:https://www.cnblogs.com/littleCode/p/3470755.html
Copyright © 2011-2022 走看看