0 引言
  Java最大的特性是与平台的无关性及开发环境的多样性。字符串被Java应用程序转化之前,是根据操作系统默认的编码方式编码。Java语言内部采用Unicode编码,它是定长双字节编码,即任何符号都用两个字节表示。在Java程序运行时,就有一个从Unicode编码到对应操作系统及浏览器支持的编码格式转换问题,若此过程有一步不对就会出现中文乱码的问题。
  1 Java Web开发中文乱码问题及解决方法
  出现乱码三种主要情况是:页面显示乱码、用户提交的数据是乱码、数据库中的数据是乱码。下面就这三种情况讨论其解决的方案,其支持的环境是J2EE5.0,服务器为Tomcat5.5.16,数据库为MYSQL5.0。
  1.1 页面显示乱码
  页面上显示乱码的现象是:当访问某个JSP或者Servlet产生的页面的时候,页面上本来应该显示中文信息的地方变成乱码。
  这时首先要分析乱码的来源。乱码的来源可能有两种情况,一种是浏览器显示不正确,另一种情况是后台在动态生成页面的时候,其内容就是乱码。所以,首先要做的是查看页面的源文件,看看里面的中文到底是不是乱码。如果不是乱码,那么说明是浏览器没有正确地解析页面的编码,否则是由于后台处理造成的。
  对于第一种情况,只需要设置JSP或者Servlet的contentType属性即可。对于JSP中的设置使用的是page指令,将其代码设置为:
  
  对于Servlet生成的页面,需要在输出页面之前调用response的setContentType()方法。其代码形式如下:
  response.setContentType("text/html;charset=gb2312");
  另外,在所生成的HTML文件的头部最好加入下面的内容:
  
  若页面本身的内容就是乱码这种情况,一般只出现在动态生成内容的那一部分。要通过源代码进一步地查找乱码产生的根源。这时数据的来源也有两种情况,一种是从数据库中取出来的数据,另一种是接收的来自页面提交的数据。下面分别进行分析和处理。
  1.2 用户提交的数据是乱码
  这种情况的表现是通过request(用户请求)对象取得用户提交的中文信息后,输出到控制台后是乱码。这种情况的原因在于request对浏览器提交的数据的解码方式不正确。可以单独采用request的setCharacterEnco
  ding()方法进行处理,但如果页面众多,每个都进行处理会很麻烦。这里,可以通过Filter(过滤器)将所有的request的编码都进行设置。
  下列程序代码就是用来设置request编码的Filter。
 

 public void doFilter(ServletRequest request,ServletResponse response, FilterChain chain)
   throwsIOException,ServletException
  {
   // 判断是否需要进行编码的设置
   if(!ignore||(request.getCharacterEncoding()==null))
  {
  // 得到配置文件中的编码类型
   String encoding=selectEncoding(request);
   if(encoding!=null)
  request.setCharacterEncoding(encoding);
  }
  chain.doFilter(request,response);
  }

  

  1.3 数据库中的数据是乱码
  这种情况多发生在向数据库写入数据的时候,偶尔也有可能出现数据库中的内容是正确的(通过数据库本身的工具可以正确地读取数据),但查询出来的结果是乱码。这种情况下,首先要检查执行的SQL语句是否正确,也就是将SQL语句输出到控制台后看其所包含的中文字符是否为乱码。如果是,需要找到其根源。否则应该是数据库自身的设置问题。
  由于这类问题,没有一个通用的解决方法,在这里就以MySQI 5.0为例,解决中文乱码问题采取的方法进行介绍。
  1)修改MySQL的配置文件。打开\my.init文件,把[mysqld]区的语句default-character-set=latinl修改为default-charact
  er-set=gbk,在[client]区增加default-character-Set=gbk。修改后,数据库默认支持的编码格式就被改成了gbk编码。
  2)在向表中插人中文时,先把中文字符编码转换为latin1编码,然后再插人表中,可通过下面代码实现:
  String str= new String("大家好! ".GetBytes("gb2312"),"ISO88
  59-1");
  String sql="INSERT INTO Test VALUES(" +str+",";Stmt.execut
  EUpdate(sq1);
  在从数据库中读取数据时,再将latinl编码的字符转换为汉字字符,可通过下面代码实现:
  String X=new String((r8.getString("title")).getBytes("ISO8859
  -1"),"gb2312");
  2 结束语
  为了避免Java Web应用程序开发过程中出现乱码,首先要清楚乱码出现的根源在哪,按照在显示用户界面、接收用户数据、保存到数据库、从数据库读取数据和将数据库中的数据显示给用户的顺序,逐步地查找,然后再采取相应的对策。本文所讨论的几种解决方案,基本解决了各种情况下的中文乱码问题。

Java编程中中文乱码问题的研究及解决方案的更多相关文章

  1. 201671010127 2016—2017—2 Java怎样解决Java程序中中文乱码的问题。

    这是本次第二次分享新手在编程中遇到的问题,相信很多Java新手和我一样,在Java编程中会遇到中文乱码的情况,下面我就给大家分享我遇到问题和解决问题的具体过程. 我先用Notepad++写了一个如下的 ...

  2. java开发中中文乱码总结

    1.jsp页面内容显示乱码 这种乱码原因很简单,一般的工具或解码程序对中文字符解析时采用默认的解码方式: <%@ page contentType="text/html; charse ...

  3. 深入剖析Java编程中的中文问题及建议最优解决方法

    摘录自:http://fafeng.blogbus.com/logs/3062998.html http://www.blogbus.com/fafeng-logs/3063006.html 深入剖析 ...

  4. Javaweb编程中的乱码问题

    程序中的乱码问题,主要出现在我们处理中文数据的过程中出现.从浏览器向服务器请求数据,服务器返回的数据在浏览器中显示为乱码.或者是服务器中的java文件用到中文,也有可能会出现乱码.数据库在处理数据的时 ...

  5. java: jsp:param中文乱码

    java: jsp:param中文乱码 假如a.jsp/b.jsp文件中 a.jsp代码: 需要加入:request.setCharacterEncoding("UTF-8")  ...

  6. Java编程中“为了性能”尽量要做到的一些地方

    最近的机器内存又爆满了,除了新增机器内存外,还应该好好review一下我们的代码,有很多代码编写过于随意化,这些不好的习惯或对程序语言的不了解是应该好好打压打压了. 下面是参考网络资源总结的一些在Ja ...

  7. mysql中中文乱码问题

    作用:约束用来保证数据有效性和完整性 . 定义主键约束 主键约束 primary key : 信息记录某个字段可以唯一区分其他信息记录,这个字段就可以是主键 (唯一 非空)   primary key ...

  8. Java 编程中关于异常处理的 10 个最佳实践

    异常处理是Java 开发中的一个重要部分.它是关乎每个应用的一个非功能性需求,是为了处理任何错误状况,比如资源不可访问,非法输入,空输入等等.Java提供了几个异常处理特性,以try,catch 和 ...

  9. Java编程中获取键盘输入实现方法及注意事项

    Java编程中获取键盘输入实现方法及注意事项 1. 键盘输入一个数组 package com.wen201807.sort; import java.util.Scanner; public clas ...

随机推荐

  1. django examples 学习笔记(1)创建一个独立的python环境

    pip install virtualenv   创建一个虚拟环境 virtualenv   my_env      创建一个独立的环境 source my_env/bin/activate   激活 ...

  2. linux日常管理-free查看内存工具

    查看内存 命令 free  默认是k为单位 也可以指定 m为单位 或者G为单位,这个不精准 total 总容量 used  使用了多少 free  剩余多少 看第二行.第一行是物理内存,加上虚拟内存b ...

  3. Struts学习总结 学习

    ContextMap 包含值栈包含 root(list结构)和context(map结构)  值栈包含contextMap的引用.  Actioncontext是工具类 可以获取他们 Struts2拥 ...

  4. Ubuntu使用crontab 使用举例

    除了这些固定值外,还可以配合星号(*),逗号(,),和斜线(/)来表示一些其他的含义:     星号          表示任意值,比如在小时部分填写 * 代表任意小时(每小时)   逗号      ...

  5. Ubuntu下crontab命令的用法

    cron是一个Linux下的后台进程,用来定期的执行一些任务.因为我用的是Ubuntu,所以这篇文章中的所有命令也只能保证在Ubuntu下有效,但其他系统应该也差不多. 想要让cron执行你指定的任务 ...

  6. 阶段4-独挡一面\项目-基于视频压缩的实时监控系统\Sprint1-基于Epoll架构的采集端程序框架设计\第2课-基于Epoll的采集端程序框架设计

    回顾之前的整个程序架构 把epoll机制应用到这个架构上去 下面主要去分析我们的系统中有没有需要等待的事件,先看看采集子系统 在采集子系统当中,摄像头有数据,摄像头采集到图像数据可以作为一个等待事件. ...

  7. 7.23实习培训日志-JDBC

    总结 今天下午考试,JDBC,这个本身很简单,但是需要我们Dockerfile+Docker Compose运行,这个东西就很复杂.原来学习时没有怎么看,这一次就很懵,完全不知道怎么弄,反正环境都没有 ...

  8. 实验楼Linux基础入门第一周

    &&使用oschina的git服务器 1.创建了项目 https://git.oschina.net/abc99/wyq20169314 2.配置项目 (1)为项目添加公钥 项目管理- ...

  9. 项目:IT资源共享资源(登录前端)<1>

    公众号技术标签 小程序 PHP 源码 项目 IT资源共享项目 这是前年自己收集了一些网络开发资源,上传到百度网盘,提供积分兑换.上线后用户在两个月内达到3427人,其中用java,PHP,前端,Pyt ...

  10. unity 3d 之合并网格和贴图(combine mesh and texture)

    https://www.cnblogs.com/eangulee/p/3877824.html unity 3d 之合并网格和贴图(combine mesh and texture)   本人是个小白 ...