Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 985|回复: 0

JAVA中令人头疼的编码问题

[复制链接]

该用户从未签到

发表于 2011-10-10 19:36:08 | 显示全部楼层 |阅读模式
也不知道是怎么了,在Java Web应用中我经常会碰到乱码问题。今天整整花了一下午的时间特意去解决这个问题,结果收获颇丰。下面是我的心得,写出来供大家分享。
     首先解释一下经常遇到的几种编码:
     ISO8859-1:属于单字节编码,最多能表示的字符范围是0-255,应用于英文系列。

     GBK2312/GBK: 汉字的国标码,专门用来表示汉字,是双字节编码。其中gbk编码能够用来同时表示繁体字和简体字,而gb2312只能表示简体字,gbk是兼容gb2312编码的。

     UNICODE: 这是最统一的编码,可以用来表示所有语言的字符,而且是定长双字节(也有四字节的)编码,包括英文字母在内。所以可以说它是不兼容iso8859-1编码的,也不兼容任何编码。

     UTF:utf编码兼容iso8859-1编码,同时也可以用来表示所有语言的字符,不过,utf编码是不定长编码,每一个字符的长度从1-6个字节不等。另外,utf编码自带简单的校验功能。一般来讲,英文字母都是用一个字节表示,而汉字使用三个字节。
     了解了几种编码后,我们要考虑怎样来统一编码以及解决中文乱码问题了。WEB应用中编码问题主要分为两大类。第一类,Post请求时的编码问题,由于Post请求是传递数据是在请求体中,其编码和页码编码一致,所有比较容易搞定,以页面编码为GB2312为例,服务器短取数据时只要使用request.setEncodingChartset("gb2312")设置就行。第二类,Get请求,由于Get请求是使用URL传参,而Url参数的编码与客户端浏览器设置有关(具体是怎么回事我还没搞清楚)。
     下面说一下我解决中文乱码的心得:第一,修改Tomcat的server.xml配置文件
          <Connector port="8888" maxHttpHeaderSize="8192"
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" redirectPort="8443" acceptCount="100"
               connectionTimeout="20000" disableUploadTimeout="true"
               URIEncoding="gbk"/>
      这是修改后的配置文件,注意最后一行,这应该是解决Get请求时对RUL进行编码,具体什么意思没深研究。
      第二,对与统一所有请求和响应的编码最好的办法是使用过滤器
        public void doFilter(ServletRequest request, ServletResponse response,
                              FilterChain chain) throws IOException, ServletException {
   
         request.setCharacterEncoding("gbk");
        response.setContentType("text/HTML;charset=gbk");
        chain.doFilter(request, response);
    }
      这是过滤器的doFilter方法,将请求和响应的编码都设置为GBK(和页码编码一致)。

    <filter>
      <filter-name>encodingFilter</filter-name>
      <filter-class>common.EncodingFilter</filter-class>
    </filter>
    <filter-mapping>
      <filter-name>encodingFilter</filter-name>
      <url-pattern>/*</url-pattern>
    </filter-mapping>
    这是过滤器的配置文件。

    总结:java的编码问题是个很头疼的事情,以后发现其他好的方法,或新的编码问题再补充。
回复

使用道具 举报

该用户从未签到

发表于 2011-10-11 12:25:52 | 显示全部楼层
这是个非常纠结的问题啊。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2024-5-6 02:58 , Processed in 0.392517 second(s), 47 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表