`
yhq1212
  • 浏览: 78081 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

ie6 和ie7版本带来的一个奇怪的中文乱码问题(长度为奇数时最后一个字符会出现乱码)(转)

    博客分类:
  • java
 
阅读更多

ie6 和ie7版本带来的一个奇怪的中文乱码问题(长度为奇数时最后一个字符会出现乱码)(转)

    博客分类:
    JavaWeb



最近完成一个jsp开发的项目,却被中文处理的乱码问题搅得好烦,尤其是由.net转身过来的朋友,更是深有体会。

而这个问题更是中文由于ie版本的不同,所引起的特殊的奇怪问题:

表现为:ie7正常,ie6 参数就会出现中文接受信息错误。(长度为奇数时最后一个字符会出现乱码 )

原因:ie7支持UTF8编码,但是ie6支持不好。

解决方法:

1、用post发送,这个方法当然不出错了,但是,有时候必须用传参的方法,那就没则了,用第二个方法。

2、习惯把中文字符串 显示长度设置为偶数
--------------------------------------------------------

情况是:
全是汉字时,无论奇数还是偶数,都无乱码,
如果是英文中文混合,并且英文字符数是奇数时,就会出现最后有一个?号
如果是英文中文混合,并且英文字符数是偶数时,无乱码


现在的处理逻辑是,在业务方法里进行判断,如果输入的字符个数为奇数,则给其拼接上一个全角的空格,如果是半角的空格,也会有乱码问题.


我暂时试了这个办法, 居然解决问题,



form是以post方式传递的,pager-taglib中接受到得参数会以get方式传递,所以接受到得参数会是乱码,解决办法将tomcat的server.xml中的connector改为:
Xml代码 复制代码

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

Xml代码  收藏代码

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

通过的上面的设置,在IE6中传递偶数的中文参数不会有问题,但是传递基数的中文参数同样是乱码(此问题只有iE6有,IE7其他浏览器都不存在此问题)。问题解决办法:引入java.net.URLEncoder包,将要传递的中文字符通过URLEncoder.encode(request.getParameter("key"),"utf-8")解析传递即可。
Html代码 复制代码

    <%@ page language="java" pageEncoding="utf-8"%> 
    <%@page import="java.net.URLEncoder;"%> 
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> 
    <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%> 
    <%@ taglib uri="http://jsptags.com/tags/navigation/pager" prefix="pg"%> 
    <%  
    String path = request.getContextPath();  
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
    %> 
    <form action="lucene/search.do" method="post"> 
        <label>时间范围:</label> 
        <input name="sDate" type="text" onfocus="HS_setDate(this)" readonly>&nbsp;&nbsp;至&nbsp;&nbsp;  
        <input name="eDate" type="text" onfocus="HS_setDate(this)" readonly> 
        <label>&nbsp;&nbsp;关键字:</label> 
        <input name="key" type="text"> 
         &nbsp;&nbsp;  
        <input  type="submit" value="搜索" style="color:#000;"> 
         &nbsp;&nbsp;  
    </form> 
     
    <pg:pager url="lucene/search.do" index="half-full" items="${Pager.totalcount}" maxPageItems="${Pager.limit}" 
              export="currentPageNumber=pageNumber" scope="request"> 
              <pg:param name="totalCount" value="${Pager.totalcount}"></pg:param> 
              <pg:param name="limit" value="${Pager.limit}"></pg:param> 
              <pg:param name="sDate" value="${sDate}"/> 
              <pg:param name="eDate" value="${eDate}"/> 
                 
        <table width="100%" border="0" cellspacing="0" cellpadding="0" class="list1" id="table1"> 
            <tr> 
              <th width="40" class="num">序号</th> 
              <th width="80">&nbsp;</th> 
              <th width="266">情报标题</th> 
              <th width="292">时间</th> 
              <th width="204">来源</th> 
            </tr> 
                  <c:forEach var="info" items="${Pager.data}" varStatus="i"> 
                        <tr> 
                            <td class="num">${i.count}</td> 
                             <td class="ico"></td> 
                             <td> <a href="information/detail.do?id=${info.id}&key=<%=URLEncoder.encode(request.getParameter("key"),"utf-8")%>"target="mainFrame">${info.title}</a> 
                             </td> 
                            <td> <fmt:formatDate value="${info.createDate}" pattern="yyyy-MM-dd" /> 
                            </td> 
                            <td>${info.source}  
                            </td>  
                        </tr>  
                    </c:forEach> 
        </table> 
          
           <div class="page"> 
            <div>第 <B>${currentPageNumber}</B> / <SPAN>${Pager.totalpage}</SPAN> 页 每页<B>${Pager.limit}</B> 条 共<B>${Pager.totalcount}</B>条记录 </div> 
            <div> 
                <pg:first><a href="${pageUrl}&key=<%=URLEncoder.encode(request.getParameter("key"),"utf-8")%>">首页</a></pg:first> 
                <pg:prev><a href="${pageUrl}&key=<%=URLEncoder.encode(request.getParameter("key"),"utf-8")%>">上一页</a></pg:prev> 
                <pg:pages>&nbsp;<a href="${pageUrl}&key=<%=URLEncoder.encode(request.getParameter("key"),"utf-8")%>">${pageNumber}</a>&nbsp;</pg:pages> 
                <pg:next><a href="${pageUrl}&key=<%=URLEncoder.encode(request.getParameter("key"),"utf-8")%>">下一页</a></pg:next>    
                <pg:last><a href="${pageUrl}&key=<%=URLEncoder.encode(request.getParameter("key"),"utf-8")%>">尾页</a></pg:last> 
            </div> 
        </div>      
    </pg:pager> 

jsp页面这样改:
function getOutLawMessage(){
  var outLawNum = encodeURI($("#outLawNum").val());
  var outLawName = encodeURI($("#outLawName").val());
  
  var birthday = encodeURI($("#birthday").val();
  var nickName = encodeURI($("#nickName").val();
  var caseNumber = encodeURI($("#caseNumber").val();
  var caseCateUuid = encodeURI($("#caseCateUuid").val();
  document.getElementById("list_message_iframe").src="/oaw/view/department_menu/search_outlaw_message.do?outLawNum="+outLawNum+"&outLawName="+outLawName+"&birthday="+birthday+"&nickName="+nickName+"&caseNumber="+caseNumber+"&caseCateUuid="+caseCateUuid;
}


最后再接收是用
String parm = new String(request.getPremates("parematename").getBytes("ISO-8859-1"),"UTF-8");
分享到:
评论

相关推荐

    奇数个中文字符url传递乱码

    解决奇数个中文字符url传递乱码问题,做了好久才找到的解决方案!

    C# sqlite 中文乱码的解决方法

    可以解决中文乱码问题,共享给大家,解决UTF-8 转换 gb2312,直接放到Bin目录中并引用

    java文件编码GBK转utf8完美解决方案

    idea、Eclipse等项目导入.java文件中文乱码完美解决方案:文件夹下所有GBK编码的.java一键转为utf-8,操作方式:将GBK2UTF8.jar文件考到需要转码项目目录,在当前位置运行控制台,输入命令java -jar GBK2UTF8.jar,...

    Java进制/时间/日期/字符串/流算法大全

    判断一个数字是奇数还是偶数 用Hibernate 实现分页 35 选7 彩票程序 获取GMT8 时间 中文乱码转换 Big5 字与Unicode 的互换 取得服务器当前的各种具体时间 用半角的特殊符号代替全角的特殊符号 数组和数组之间的转换...

    java 算法

    JAVA时间格式化处理 ,将毫秒转化为日期, 文本的倒序输出 ,判断一个数字是奇数还是偶数 ,用Hibernate实现分页, 35选7彩票程序 ,获取GMT8时间, 中文乱码转换 ,小标签 ,Big5字与Unicode的互换, 取得服务器...

    SQL 截取字符串应用代码

    字符串截取函数,只限单字节字符使用(对于中文的截取时遇上奇数长度是会出现乱码,需另行处理),本函数可截取字符串指定范围内的字符。

    java版的算法大全

    Java的16进制与字符串的相互转换函数 JAVA时间格式化处理 将毫秒转化为日期 文本的倒序输出 判断一个数字是奇数还是偶数 35选7彩票程序 中文乱码转换

    jspsmartupload上传下载,已修改过源代码!

    采用jspsmartupload上传文件时,如果文件名含有中文,在服务器端取得文件名是会出现乱码。如果表单项中填写了中文,一样会有乱码问题。看了下jspsmartupload的源码,改了两个地方,现在可以没有乱码问题了。 第一...

    DES数据加密

    对于每一个数据块,它使用位循环移位和xor操作来产生一个16位或32位的校验和 ,这使得丢失一位或两个位的错误一定会导致校验和出错。这种方式很久以来就应用于文件的传输,例如 xmodem-crc。 这是方法已经成为标准,...

    二维码编码解码器源码20130905

    经网友反映,还是有些中文会出现解码成乱码,而有些又可以,估计还是guessEncoding方法猜测编码出现了偏差,直接将guessEncoding方法写成返回UTF8就行了。 4.实现图片解码,即把条形码或二维码图片解码成其真实内容...

    二维码编码解码器源码

    经网友反映,还是有些中文会出现解码成乱码,而有些又可以,估计还是guessEncoding方法猜测编码出现了偏差,直接将guessEncoding方法写成返回UTF8就行了。 4.实现图片解码,即把条形码或二维码图片解码成其真实内容...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    本书是第II卷,以开发人员在项目开发中经常遇到的问题和必须掌握的技术为中心,介绍了应用Java进行桌面程序开发各个方面的知识和技巧,主要包括Java语法与面向对象技术、Java高级应用、窗体与控件应用、文件操作...

Global site tag (gtag.js) - Google Analytics