做Java项目过程中遇到乱码问题的解决方案

在做java项目(特别是web项目)的过程中,中文乱码一直是我们开发人员比较头疼的问题,因为涉及到编码,解码,字符集,以及国际化等诸多问题,所以在着手解决的时候也缺乏相关的知识。我花了一些时间自己动手实验了一把,虽然没有洞悉编码,解码这些底层原理,但是解决实际问题应该足够了。这里主要针对java web项目中的文乱码问题。
  从浏览器采用form方式提交数据到服务器,可以分为post和get方法。
  1,post方法:
  在jsp页面中的page指令中,有一个pageEncoding,这个指令表示jsp翻译成servlet时采用的编码,以及form提交数据的编码格式。所以post方法提交数据的编码格式由pageEncoding指定。那解码方式呢?通常,我们在页面设置了pageEncoding=”utf-8”,在后台用request.getParameter()得到的往往是乱码,而进一步通过new String(getBytes(“iso-8859-1”),”utf-8”)处理之后就能得到正确的数据。这是因为服务器默认的解码方式是iso-8859-1,所以用编码,解码流程解释上面那2个动作分别是:utf-8编码—>iso-8859-1解码(当然是乱码); utf-8编码—>iso-8859-1解码—>iso-8859-1编码—>utf-8解码,这是个对称的过程,所以能正确得到数据。那服务器默认的解码方式能改吗?当然可以,调用request.setCharacterEncoding()就能设置,而且只针对post方式有效,设置以后request.getParameter()直接就是正确的数据了。
  2,get方法
  与post方法一样,编码方式由pageEncoding指定,但是get方式的解码方式与post就不一样了。在tomcat的conf目录下有一个server.xml的配置文件,在里面找到Connector节点,有一个URIEncoding属性,这个属性就是指定get方式的数据解码格式的,而且只针对get方式有效。其他处理与post一样。
  另外,通过Ajax请求向后台发送的数据由于是附在URL地址后面的,所以跟get请求一样。编码由pageEncoding指定,解码由URIEncoding指定。但是有很多开发人员乐于另外一种方式:用两次encodeURI编码,然后在后台用URLDecoder.decode(str,”utf-8”)解码。这是一个什么过程呢?我们知道,encodeURI编码是采用的utf-8编码,所以,这个过程为:utf-8编码—>utf-8编码—>iso-8859-1解码—>utf-8解码。这看起来不像一个对称过程,但最后为什么能得到正确结果呢?这是因为经过第一次utf-8编码之后,产生的已经是非中文字符,所以,对非中文字符采再用utf-8编码,iso-8859-1解码不会有任何问题,这样看来,它还是一个对称的编码,解码过程,当然能正确解析了。
  当然,我所说的这个“对称”编码解码过程,也不是所有编码都适用,例如:
  gbk编码—>utf-8解码—>utf-8编码—>gbk解码,最后还是乱码!
  因为gbk编码—>utf-8解码产生了不可恢复的错误,造成了信息丢失,至于为什么产生永久错误,得从编码的底层说起……

最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2024-10-24 02:01:49

做Java项目过程中遇到乱码问题的解决方案的相关文章

软件-菜鸟求帮助:用myecplise写项目过程中鼠标无意中把一个包移动到了其他包下,我怎么再移回来啊

问题描述 菜鸟求帮助:用myecplise写项目过程中鼠标无意中把一个包移动到了其他包下,我怎么再移回来啊 我用的是myecplise编写的web项目,在编写中查看项目的时候,鼠标无意中把一个放jar包的libs包 移动到了webroot下,我再撤销也回不来,直接拖拽也无法复位,由于是刚接触Java软件行业不久,对 对这些个错误都比较无奈,往往遇到这个情况我都是把项目删除,然后再拿之前的项目写,但是这样 犯错但是不知道好的解决办法,真的是一件很痛苦的事,所以真心求助各位大侠,把你们的经验传授我点

谈谈在项目过程中的发生争论与争吵

    有一句古话说的好,"有人的地方就有江湖".     与瀑布模式相比,敏捷开发 更注重人与人的交流.所以在开发过程中更有可能会发生各种争论.争吵.     首先说为什么会吵起来?个人原因咱就不说了,只说说项目过程中时引起的争论甚至是争吵吧.     1. 对于同一个问题,2个人有不同的观点,谁也说服不了谁     2. 自己的想法或设计被多次否定,自己说不出来哪好,对方说不出来哪差     3. 双方理解不一致,导致结果偏离太大     以上三条是我认为在项目开发过程中经常遇到的

学习JAVA语言过程中可能遇到的共同问题

这节教程将讨论一些在学习JAVA语言过程中可能遇到的共同问题. 问题一:编译器找不到类. 解决方法: 确保你已经导入了类或者它的包. 如果对CLASSPATH环境变量有进行设置,要重新复位. 确保类名的拼写跟定义的一样,要注意大小写问题. 如果类在包中,要确保它们处在正确的子目录中. 同时,一些程序员从.java文件名字为类使用不同的名字.要确保你是使用类名字而不是文件名.实际上,使类名和文件名相同就不会出现这个错误了. 问题二:注释器不能找到其中一个类 解决方法: 确保你指定的是类名而不是类的

开发项目过程中辅助方法好处多多

在开发项目过程中,总是会出现大量的辅助方法,例如字符串处理,代码检 验,格式输出等等.如果您发现自己在多次编写类似的代码,可能就要想着如何 把这些代码进行提取,变成辅助方法(亦或是类库甚至框架,关于这方面粒度问 题在此不作讨论).辅助方法的作用除了遵循DRY原则之外,也能让代码更容易 编写,更为清晰,可读性也能更好--而且只要您"去做",就会发现要得到这 些好处并不困难. 在这里举一个最简单的例子,对Index方法的单元测试: [TestMethod] public void Inde

java mysql-用mysql做java项目开发

问题描述 用mysql做java项目开发 做数据库的时候出了问题如下CSDN移动问答 求好心的大神解答 万分感谢

java-在jae上搭建的Java项目,连接mysql乱码,本地没问题

问题描述 在jae上搭建的Java项目,连接mysql乱码,本地没问题 云数据库上显示的编码是utf-8,java连接mysql用的也是utf-8,在本地连接mysql没有任何问题,在jae上就出问题,哪位朋友遇见过同样的问题吗?

java 传递过程中出现的问题解决方法

java 传递过程中出现的问题解决方法  * 测试conn关闭情况  */ package com.hb.test; import java.sql.connection; /**  *  * @author icecold  */ public class testconn {    static connection conn = null;     public static void main(string[] args)throws exception {         conn =

用eclipse做java项目,想要得到图片轮换是下方附带相应的文字说明的效果,不知道该怎样做!求大神指导!

问题描述 用eclipse做java项目,想要得到图片轮换是下方附带相应的文字说明的效果,不知道该怎样做!效果类似下图!求大神指导!目前只用imageswitcher做了图片切换!急用,忘大神解答,感激不尽!如果可以,请把源码发邮箱18389593580@163.com 解决方案 解决方案二:刚一来就遇见伸手党解决方案三:我也想做大神,奈何就是一啥都不懂的菜鸟!见谅!

网站做优化的过程中出现百度快照突然间回档问题

摘要: 上个周末,手中的菜鸟seo论坛百度快照回档18天,当时我吓傻了眼,此前保持百度快照天天更新,突然的快照回档肯定是出大问题了.我甚至推掉周末的约会,结合菜鸟seo论坛百度快照 上个周末,手中的菜鸟seo论坛百度快照回档18天,当时我吓傻了眼,此前保持百度快照天天更新,突然的快照回档肯定是出大问题了.我甚至推掉周末的约会,结合菜鸟seo论坛百度快照的情况,蹲家里研究了半天.网上关于百度快照回档帖子虽然很多,但对我的网站似乎没什么用处.第二天网站百度快照恢复到隔夜水平,而我对百度快照回档的研究