Web中的中文乱码

原文链接:http://czy4411741.blog.163.com/blog/static/34203127200991804738266/

简述

URL传递参数的格式为url?param=value&param=value

当参数中包含特殊字符的时候就会出现混乱甚至错误,例如空格,字符&等等。所以JavaScript提供了一个escape函数对字符串进行编码操作,可惜的是,这个编码操作对于JAVA来说,是不适合的,使用escape编码是以\u开头,而Java使用的Unicode编码则是二进制编码。而且更加令人失望的是,使用escape编码的字符串会使得服务端的JSP得不到值。 

中文乱码产生的原因

a) 乱码有很多种,这里所说的是指web传入的乱码,即由浏览器传输数据到服务器发生的乱码。

b) 常用的web传输方法有 post 和 get 2种,下面分别说明:

  • Post:由于采用了特殊的加密,所以只要设置正确的 Character Encoding 即可,不会产生乱码
  • Get:用此类方法传输的数据将以字符串的形式直接放在url后面,所以采用的是url 的 encode,这种情况不仅会出现中文乱码,而且假如参数里面带有保留字符也将被转义,特别地,如果参数中带有 & 字符,将丢失后面的所有参数或者值

解决办法

解决中文乱码(应该说是数据传输问题),主要应该从用法上解决。上面说了post方法只要设置了正确的 Character Encoding,是不会产生乱码的,所以应尽量采用post方法来传输数据;但是有时候采用get方法是比较方便的,或者是必须的,所以下面也分别介绍 2种的对应解决方案:
a) Post:在web.xml设置filter,filter-class指定为平台的SetCharacterEncodingFilter类,encoding设置为页面使用的编码,示例:

<filter>
        <filter-name>Set Character Encoding</filter-name>
        <filter-class>
                //自己实现一个filter。。
        </filter-class>
        <init-param>
                <param-name>encoding</param-name>
                <param-value>UTF-8</param-value>
        </init-param>
</filter>
<filter-mapping>
        <filter-name>Set Character Encoding</filter-name>
        <url-pattern>/*</url-pattern>
</filter-mapping>

b) Get:解决的关键在于在传输之前调用url encoder对参数进行加密,采用的encoding应与服务器的encoding一致,这样接收到数据的时候可以不做任何的转码。可由java 和 javascript 2 种办法实现:

  • Java 实现方法(推荐)
    条件:如果要传输的数据是要先经过javabean生成,然后write 到页面上的,可以采用这种方式。以下略,用java.net.URLEncoder.encode();
  • Javascript 实现方法
    如果需要从页面获取输入,则可以采用这种方式,但是这种情况又可以考虑是否可以转换为post方法来传输。

javascript 的 encode 函数:

  • escape - 采用ISO Latin字符集对指定的字符串进行编码。不会被此方法编码的字符: @ * / +
  • encodeURI - 把URI字符串采用UTF-8编码格式转化成escape格式的字符串不会被此方法编码的字符:! @ # $& * ( ) = : / ; ? + ‘
  • encodeURIComponent - 把URI字符串采用UTF-8编码格式转化成escape格式的字符串。不会被此方法编码的字符:! * ( ) ‘
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值