只要掌握了中文乱码问题产生的原因,然后对症下药,就可以顺利地解决这些问题。下面我们对容易产生乱码问题的场景进行分析,并提出解决方案。

1.以POST方法提交的表单数据中有中文字符

由于Web容器默认的编码方式是ISO-8859-1,在Servlet/JSP程序中,通过请求对象的getParameter()方法得到的字符串是以ISO-8859-1转换而来,这是导致乱码产生的原因之一。为了避免容器以ISO-8859-1的编码方式返回字符串,对于以POST方法提交的表单数据,可以在获取请求参数值之前,调用request.setCharacterEncoding("GBK"),明确指定请求正文使用的字符编码方式是GBK。在向浏览器发送中文数据之前,调用response.setContentType("text/html;charset=GBK"),指定输出内容的编码方式是GBK。

对于JSP页面,在获取请求参数值之前,写上下面的代码:

为了指定输出内容的编码格式,设置page指令contentType属性,如下:

在Web容器转换JSP页面后的Servlet类中,会自动添加下面的代码:

response.setContentType("text/html; charset=GBK");

2.以GET方法提交的表单数据中有中文字符

当提交表单采用GET方法时,提交的数据作为查询字符串被附加到URL的末端,发送到服务器,此时在服务器端调用setCharacterEncoding()方法也就没有作用了。我们需要在得到请求参数的值后,自己做正确的编码转换。

String name = request.getParameter("name");

name=new String(name.getBytes("ISO-8859-1"),"GBK");

在第一行,调用getParameter()方法得到的字符串name的Unicode值是以ISO-8859-1编码转换而来,调用name.getBytes("ISO-8859-1"),将得到原始的GBK编码值,接着,对new String()的调用将以GBK字符集重新构造字符串的Unicode编码。

为了方便从ISO-8859-1编码到GBK的转换,我们可以编写一个工具方法,如下:

public String toGBK(String str)

throws java.io.UnsupportedEncodingException

{

return new String(str.getBytes("ISO-8859-1"),"GBK");

}

3.在数据库中存储和读取中文数据

对于大多数数据库的JDBC驱动程序,在Java程序和数据库之间传递数据都是以ISO-8859-1为默认编码格式,所以,我们在程序中向数据库存储包含中文的数据时,JDBC驱动程序首先把程序内部的Unicode编码格式的数据转化为ISO-8859-1编码,然后传递到数据库中,加上数据库本身也有字符集,这就是为什么我们常常在数据库中读取中文数据时,读到的是乱码。

要解决上述问题,只需要将数据库默认的编码格式改为GBK或GB2312即可,不同的数据库还提供了另外的方式来处理字符编码转换的问题,读者在实际应用过程中,可针对具体情况再做具体处理,只要理解了编码转换的过程,就能找到问题的所在,进而解决问题。

4.Servlet/JSP在不同语言系统的平台下运行

有时候,我们在中文系统平台下开发的Web应用程序移植到英文系统平台下,在Servlet和JSP中直接书写的中文字符串在输出时,将显示为乱码。这是因为在编译Servlet类或者JSP文件时,如果没有使用-encoding参数指定Java源程序的编码格式,javac会获取本地操作系统默认采用的字符集,以该字符集将Java源程序转换为Unicode编码保存到内存中,然后将源程序编译为字节码文件(字节码文件采用的是UTF-8编码),保存到硬盘上。

在英文平台下,采用的默认编码格式是ISO-8859-1,所以在编译转换后,执行输出时,原先在源文件中书写的中文字符串就变成了乱码。

要解决这个问题,在编译Servlet类的源程序时,可以用-encoding参数指定编码为GBK或GB2312,例如:

javac –encoding GBK HelloServlet.java

对于JSP页面,只要在page指令中用contentType属性或pageEncoding属性指定编码格式为GBK或GB2312,Web容器就可以正确转换和编译JSP文件了。例如:

在实际的Web应用中,乱码问题产生的原因多种多样,然而只要我们理解了字符编码的转换过程,仔细地分析乱码产生的原因,找到问题的关键,就能对症下药,解决问题。

分享到:

2009-08-21 21:22

浏览 1970

评论

java中文乱码_Java中文乱码问题的解决方案相关推荐

  1. java 奇数中文乱码_java web 乱码 整理

    众所周知 java 程序使用的是Unicode 编码字符集,是说java内存里面使用Unicode字符集操作文字,java内存外当然使用的是程序员自己制定的字符集,如果程序员没有指定字符集,那么会使用 ...

  2. c与java的中文乱码_Java 中文乱码问题总结

    由于Java编程中的中文问题是一个老生常谈的问题,在阅读了许多关于Java中文问 题解决方法之后,结合作者的编程实践,我发现过去谈的许多方法都不能清晰地说明问题及解决问题,尤其是跨平台时的中文问题.于 ...

  3. java 空格乱码_java 中文乱码以及空格乱码解决方案总结

    当使用response.write返回JSON数据到前端时,需要在前面加上这句 response.ContentType = "text/html;charset=gb2312"; ...

  4. java 对象乱码_java对象乱码怎么办

    java对象乱码怎么办,乱码,方式,数据库,要用,解决办法 java对象乱码怎么办 易采站长站,站长之家为您整理了java对象乱码怎么办的相关内容. java对象乱码的解决办法:1.文件下载乱码时,下 ...

  5. java 页面编码_java中文乱码解决之道(七)-----JSP页面编码过程

    我们知道JSP页面是需要转换为servlet的,在转换过程中肯定是要进行编码的.在JSP转换为servlet过程中下面一段代码起到至关重要的作用. 在上面代码中有两个地方存在编码:pageEncodi ...

  6. java encode乱码_java 中文乱码问题的解决

    java中的中文乱码问题应该是我们经常碰到的一个问题,今天就来总结下对于乱码问题的解决方法: 1. 超链接中带有的中文字符,添加 这样如果不进行处理在后台得到的数据就会出现中文乱码的问题,由于超链接实 ...

  7. java转换中文乱码_java中文乱码解决之道(四)-----java编码转换过程

    前面三篇博客侧重介绍字符.编码问题,经过这三篇博客各位博友对各类字符编码有了一个初步的了解,要了解java的中文问题这是必需要了解的.可是了解这些仅仅只是一个开始,如下博客将侧重介绍java乱码是如何 ...

  8. java 特殊字符 乱码_Java中文乱码特殊字符解决方案

    Java中文乱码&特殊字符解决方案 相信很多朋友遇到过Java的乱码问题,最近我也在解决一个"使用文本生成图片过程中中文以及特殊字符乱码"的问题:花了我大量时间,Debug ...

  9. java处理中文字符_Java中文字符处理的四大迷题

    虽然计算机对英文字符的支持非常不错,我们也恨不得写的程序只会处理英文的数据,但是昨为中国人,无可避免地要处理一些中文字符.当很简单的一件事情,遇到了中文,一切就不同了!本文就会讲述实际生产环境中遇到的 ...

  10. java为什么全是乱码_java一切乱码的解释 以及源头

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 InputStreamReader in = new InputStreamReader(new FileInputStream("demo.t ...

最新文章

  1. 每日一皮:学会说话很重要...
  2. AngularJS优缺点、使用场景
  3. 云服务器apache mysql php_服务器配置教程:阿里云服务器安装PHP环境(附PHP+MySQL+Apache后台小Demo)...
  4. nacos集成dubbo实现远程服务调用多服务端2
  5. 企业实战_08_MyCat 搭建Mysql 一主二从复制环境
  6. Oracle备份文件名获取系统时间的做法(windows)
  7. RabbitMQ 关键词解释
  8. centos7.0 安装java1.8,tomcat
  9. 数据库联接字符串大全
  10. 汽车电子_EMC测试_RE试验整改
  11. 怎样获取计算机硬盘号,电脑硬盘序列号读取工具
  12. 数据面最流行的工具包dpdk的前世-现在和未来
  13. EXCEL常规格式数字转换为日期时间格式的方法
  14. 解决windows 10下文件名太长无法删除的问题
  15. Windows XP系统下建立V-PN服务器
  16. 在altium designer原理图中如何查找相同的网络标号?
  17. Wireless-AC 8265 CentOS7 无线网卡驱动安装
  18. Wifi密码破解与局域网抓包监听(小白--纯工具版)
  19. ps考试没有保存html,PS未正常关闭,未保存的文件该怎么恢复
  20. 如何可以同时登录多个账户:无痕模式的使用

热门文章

  1. 从jensen不等式到相对熵的非负性性
  2. 亲身体验 DDOS(拒绝服务)攻击硬防DIY
  3. 基于java的员工绩效考核管理系统
  4. Java程序员不得不会的124道面试题(含答案)
  5. 《暗黑破坏神2》关于d2loader的使用说明
  6. oracle 触发器 实例
  7. 聊一聊Android的第三方开发组件
  8. 安装ALEXA工具条
  9. ThinkPad T470P拆机清灰教程
  10. python utf编码 查询_python数据库查询中文乱码