- 浏览: 86752 次
- 性别:
- 来自: 天津
文章分类
- 全部博客 (110)
- java (110)
- Comparing PHP Frameworks ( Symfony (1)
- CakePHP (1)
- YII and CodeIgniter) (1)
- spring定时任务的实现 (1)
- 获得一个节点对象的节点类型 (1)
- SWT 文本框Text通过GC重绘改变边框颜色 (1)
- 常用命令收集(系统设置) (1)
- openlayers 应用Google图层你必须做的 (1)
- Shell Sort in Java (1)
- Java网络编程 (1)
- 删除more里面的Edit (1)
- Android颜色选择器 (1)
- Linux安全配置步骤简述 (1)
- 职场官话 (1)
- TOMCAT常用优化 (1)
- 2008 ==> 2009 (1)
- 01_Android介绍 (1)
- HTML特殊字符 (1)
- 终于完成一个最重要的任务——找工作 (1)
- java 加密算法 base64 (1)
- 《南方周末》《南方日报》《新京报》《南方体育》等报纸在线阅读 (1)
- 由ORM框架设计看到微软与苹果的最大差别 (1)
- 通过发微博控制电脑的程序源码 (1)
- flex入门 (1)
- JS合并单元格、JavaScript单元格合并 (1)
- 各种常用编译开关位置 (1)
- 单一入口应用程序概述 (1)
- [转]Cocoa中回调delegate的方法时判断delegate是否已经被释放 (1)
- java简单的通用ajax分页方法 (1)
- /dev/shm放/tmp (1)
- Java中HashMap排序和遍历 . (1)
- Chrome+SwitchySharp+myentunnel+SSH (1)
- LINUX-网卡Bond (1)
最新评论
-
ken890202:
java简单的通用ajax分页方法 -
hanmiao:
真够乱的,什么都看不清。
Linux安全配置步骤简述 -
houxinyou:
说一下我自己的想法.苹果只是做一款相同的东西,然后是完善.有什 ...
由ORM框架设计看到微软与苹果的最大差别 -
delphixp:
微软技术方案很多?。。。。Java 系统笑而不语。。。
由ORM框架设计看到微软与苹果的最大差别 -
huchiwei:
同意楼上说法。这代码....怎么看!!
web应用dao层的开发经验小结
from:enet硅谷动力。
自从接触java和jsp以来,就不断与java的中文乱码问题打交道,现在终于得到了彻底的解决,现将我们的解决心得与大家共享。
一、java中文问题的由来
java的内核和class文件是基于unicode的,这使java程序具有良好的跨平台性,但也带来了一些中文乱码问题的麻烦。原因主要有两方面,java和jsp文件本身编译时产生的乱码问题和java程序于其他媒介交互产生的乱码问题。
首先java(包括jsp)源文件中很可能包含有中文,而java和jsp源文件的保存方式是基于字节流的,如果java和jsp编译成 class文件过程中,使用的编码方式与源文件的编码不一致,就会出现乱码。基于这种乱码,建议在java文件中尽量不要写中文(注释部分不参与编译,写 中文没关系),如果必须写的话,尽量手动带参数-ecoding gbk或-ecoding gb2312编译;对于jsp,在文件头加上或基本上就能解决这类乱码问题。
本文要重点讨论的是第二类乱码,即java程序与其他存储媒介交互时产生的乱码。很多存储媒介,如数据库,文件,流等的存储方式都是基于字节流的,java程序与这些媒介交互时就会发生字符(char)与字节(byte)之间的转换,具体情况如下:
从页面form提交数据到java程序 byte->char
从java程序到页面显示 char?>byte
从数据库到java程序 byte?>char
从java程序到数据库 char?>byte
从文件到java程序 byte->char
从java程序到文件 char->byte
从流到java程序 byte->char
从java程序到流 char->byte
如果在以上转换过程中使用的编码方式与字节原有的编码不一致,很可能就会出现乱码。
二、解决方法
前面已经提到了java程序与其他媒介交互时字符和字节的转换过程,如果这些转换过程中容易产生乱码。解决这些乱码问题的关键在于确保转换时使用的编码方式与字节原有的编码方式保持一致,下面分别论述(java或jsp自身产生的乱码请参看第一部分)。
1、jsp与页面参数之间的乱码
jsp获取页面参数时一般采用系统默认的编码方式,如果页面参数的编码类型和系统默认的编码类型不一致,很可能就会出现乱码。解决这类乱码问 题的基本方法是在页面获取参数之前,强制指定request获取参数的编码方式:request.setcharacterencoding ("gbk")或request.setcharacterencoding("gb2312")。
如果在jsp将变量输出到页面时出现了乱码,可以通过设置response.setcontenttype("text/html; charset=gbk")或response.setcontenttype("text/html;charset=gb2312")解决。
如果不想在每个文件里都写这样两句话,更简洁的办法是使用servlet规范中的过虑器指定编码,过滤器的在web.xml中的典型配置和主要代码如下:
web.xml:
characterencodingfilter
net.vschool.web.characterencodingfilter
encodinggbk
characterencodingfilter
/*
characterencodingfilter.java:
public class characterencodingfilter implements filter
{
protected string encoding = null;
public void init(filterconfig filterconfig) throws servletexception
{
this.encoding = filterconfig.getinitparameter("encoding");
}
public void dofilter(servletrequest request, servletresponse response, filterchain chain) throws ioexception, servletexception
{
request.setcharacterencoding(encoding);
response.setcontenttype("text/html;charset="+encoding);
chain.dofilter(request, response);
}
}
2、java与数据库之间的乱码
大部分数据库都支持以unicode编码方式,所以解决java与数据库之间的乱码问题比较明智的方式是直接使用unicode编码与数据库 交互。很多数据库驱动自动支持unicode,如microsoft的sqlserver驱动。其他大部分数据库驱动,可以在驱动的url参数中指定,如 如mm的mysql驱动:jdbc:mysql://localhost/webcldb?useunicode=true& characterencoding=gbk。
3、java与文件/流之间的乱码
java读写文件最常用的类是fileinputstream/fileoutputstream和 filereader/filewriter。其中fileinputstream和fileoutputstream是基于字节流的,常用于读写二进制 文件。读写字符文件建议使用基于字符的filereader和filewriter,省去了字节与字符之间的转换。但这两个类的构造函数默认使用系统的编 码方式,如果文件内容与系统编码方式不一致,可能会出现乱码。在这种情况下,建议使用filereader和filewriter的父类: inputstreamreader/outputstreamwriter,它们也是基于字符的,但在构造函数中可以指定编码类型: inputstreamreader(inputstream in, charset cs) 和outputstreamwriter(outputstream out, charset cs)。
4、其他
上面提到的方法应该能解决大部分乱码问题,如果在其他地方还出现乱码,可能需要手动修改代码。解决java乱码问题的关键在于在字节与字符的 转换过程中,你必须知道原来字节或转换后的字节的编码方式,转换时采用的编码必须与这个编码方式保持一致。我们以前使用resin服务器,使用 smartupload组件上传文件,上传文件同时传递的中文参数获取没有乱码问题。当在linux中把resin设置成服务后,上传文件同时的中文参数 获取出现了乱码。这个问题困扰了我们很久,后来我们分析smartupload组件的源文件,因为文件上传采用的是字节流的方式,里面包含的参数名称和值 也是字节流的方式传递的。smartupload组件读取字节流后再将参数名称和值从字节流中解析出来,问题就出现在smartupload将字节流转换 成字符串时采用了系统默认的编码,而将resin设置成服务后,系统默认的编码可能发生了改变,因此出现了乱码。后来,我们更改了smartupload 的源文件,增加了一个属性charset和setcharset(string)方法,将upload()方法中提取参数语句:
string value = new string(m_binarray, m_startdata, (m_enddata - m_startdata) + 1 );
改成了
string value = new string(m_binarray, m_startdata, (m_enddata - m_startdata) + 1, charset );
终于解决了这个乱码问题
自从接触java和jsp以来,就不断与java的中文乱码问题打交道,现在终于得到了彻底的解决,现将我们的解决心得与大家共享。
一、java中文问题的由来
java的内核和class文件是基于unicode的,这使java程序具有良好的跨平台性,但也带来了一些中文乱码问题的麻烦。原因主要有两方面,java和jsp文件本身编译时产生的乱码问题和java程序于其他媒介交互产生的乱码问题。
首先java(包括jsp)源文件中很可能包含有中文,而java和jsp源文件的保存方式是基于字节流的,如果java和jsp编译成 class文件过程中,使用的编码方式与源文件的编码不一致,就会出现乱码。基于这种乱码,建议在java文件中尽量不要写中文(注释部分不参与编译,写 中文没关系),如果必须写的话,尽量手动带参数-ecoding gbk或-ecoding gb2312编译;对于jsp,在文件头加上或基本上就能解决这类乱码问题。
本文要重点讨论的是第二类乱码,即java程序与其他存储媒介交互时产生的乱码。很多存储媒介,如数据库,文件,流等的存储方式都是基于字节流的,java程序与这些媒介交互时就会发生字符(char)与字节(byte)之间的转换,具体情况如下:
从页面form提交数据到java程序 byte->char
从java程序到页面显示 char?>byte
从数据库到java程序 byte?>char
从java程序到数据库 char?>byte
从文件到java程序 byte->char
从java程序到文件 char->byte
从流到java程序 byte->char
从java程序到流 char->byte
如果在以上转换过程中使用的编码方式与字节原有的编码不一致,很可能就会出现乱码。
二、解决方法
前面已经提到了java程序与其他媒介交互时字符和字节的转换过程,如果这些转换过程中容易产生乱码。解决这些乱码问题的关键在于确保转换时使用的编码方式与字节原有的编码方式保持一致,下面分别论述(java或jsp自身产生的乱码请参看第一部分)。
1、jsp与页面参数之间的乱码
jsp获取页面参数时一般采用系统默认的编码方式,如果页面参数的编码类型和系统默认的编码类型不一致,很可能就会出现乱码。解决这类乱码问 题的基本方法是在页面获取参数之前,强制指定request获取参数的编码方式:request.setcharacterencoding ("gbk")或request.setcharacterencoding("gb2312")。
如果在jsp将变量输出到页面时出现了乱码,可以通过设置response.setcontenttype("text/html; charset=gbk")或response.setcontenttype("text/html;charset=gb2312")解决。
如果不想在每个文件里都写这样两句话,更简洁的办法是使用servlet规范中的过虑器指定编码,过滤器的在web.xml中的典型配置和主要代码如下:
web.xml:
characterencodingfilter
net.vschool.web.characterencodingfilter
encodinggbk
characterencodingfilter
/*
characterencodingfilter.java:
public class characterencodingfilter implements filter
{
protected string encoding = null;
public void init(filterconfig filterconfig) throws servletexception
{
this.encoding = filterconfig.getinitparameter("encoding");
}
public void dofilter(servletrequest request, servletresponse response, filterchain chain) throws ioexception, servletexception
{
request.setcharacterencoding(encoding);
response.setcontenttype("text/html;charset="+encoding);
chain.dofilter(request, response);
}
}
2、java与数据库之间的乱码
大部分数据库都支持以unicode编码方式,所以解决java与数据库之间的乱码问题比较明智的方式是直接使用unicode编码与数据库 交互。很多数据库驱动自动支持unicode,如microsoft的sqlserver驱动。其他大部分数据库驱动,可以在驱动的url参数中指定,如 如mm的mysql驱动:jdbc:mysql://localhost/webcldb?useunicode=true& characterencoding=gbk。
3、java与文件/流之间的乱码
java读写文件最常用的类是fileinputstream/fileoutputstream和 filereader/filewriter。其中fileinputstream和fileoutputstream是基于字节流的,常用于读写二进制 文件。读写字符文件建议使用基于字符的filereader和filewriter,省去了字节与字符之间的转换。但这两个类的构造函数默认使用系统的编 码方式,如果文件内容与系统编码方式不一致,可能会出现乱码。在这种情况下,建议使用filereader和filewriter的父类: inputstreamreader/outputstreamwriter,它们也是基于字符的,但在构造函数中可以指定编码类型: inputstreamreader(inputstream in, charset cs) 和outputstreamwriter(outputstream out, charset cs)。
4、其他
上面提到的方法应该能解决大部分乱码问题,如果在其他地方还出现乱码,可能需要手动修改代码。解决java乱码问题的关键在于在字节与字符的 转换过程中,你必须知道原来字节或转换后的字节的编码方式,转换时采用的编码必须与这个编码方式保持一致。我们以前使用resin服务器,使用 smartupload组件上传文件,上传文件同时传递的中文参数获取没有乱码问题。当在linux中把resin设置成服务后,上传文件同时的中文参数 获取出现了乱码。这个问题困扰了我们很久,后来我们分析smartupload组件的源文件,因为文件上传采用的是字节流的方式,里面包含的参数名称和值 也是字节流的方式传递的。smartupload组件读取字节流后再将参数名称和值从字节流中解析出来,问题就出现在smartupload将字节流转换 成字符串时采用了系统默认的编码,而将resin设置成服务后,系统默认的编码可能发生了改变,因此出现了乱码。后来,我们更改了smartupload 的源文件,增加了一个属性charset和setcharset(string)方法,将upload()方法中提取参数语句:
string value = new string(m_binarray, m_startdata, (m_enddata - m_startdata) + 1 );
改成了
string value = new string(m_binarray, m_startdata, (m_enddata - m_startdata) + 1, charset );
终于解决了这个乱码问题
发表评论
-
LINUX-网卡Bond
2012-02-08 15:22 893网卡bond是通过把多张网卡绑定为一个逻辑网卡,实现本 ... -
Chrome+SwitchySharp+myentunnel+SSH
2012-02-04 17:14 1889? <p style="margin ... -
Java中HashMap排序和遍历 .
2012-02-03 10:29 1953<div id="article_co ... -
/dev/shm放/tmp
2012-02-02 17:14 928呵呵,有时候不懂装懂的人挺搞笑的哈 转http://z ... -
java简单的通用ajax分页方法
2012-02-02 12:44 1799发表一个自己常用的分页的通用代码,实现了ajax分页。 ... -
[转]Cocoa中回调delegate的方法时判断delegate是否已经被释放
2012-01-31 16:58 1098<p>http://pingguohe.n ... -
单一入口应用程序概述
2012-01-11 14:03 683什么是单一入口应用程序? 在解释什么是单一入口应用 ... -
各种常用编译开关位置
2012-01-11 12:54 695vendor\third-party\products ... -
JS合并单元格、JavaScript单元格合并
2011-12-28 14:08 1110<span style="font-f ... -
flex入门
2011-12-28 12:23 875<span style="fon ... -
通过发微博控制电脑的程序源码
2011-12-20 12:29 1289前段时间看群里挺多讨论 微博api,正好前几天看到有个 ... -
由ORM框架设计看到微软与苹果的最大差别
2011-12-20 09:59 1373一不小心加入水 ... -
《南方周末》《南方日报》《新京报》《南方体育》等报纸在线阅读
2011-12-15 11:04 1257我经常到南方报业提供的网址下载他们出版的报纸看,今天突 ... -
java 加密算法 base64
2011-12-14 17:58 900<span style="color: ... -
终于完成一个最重要的任务——找工作
2011-12-14 14:54 630</span></span>& ... -
HTML特殊字符
2011-12-14 10:54 697最近在做某种模拟器上的网页的显示,需要考虑HTML特殊 ... -
01_Android介绍
2011-12-13 10:44 598? <h4 style="margin ... -
2008 ==> 2009
2011-12-13 10:39 601发现时间过的真的很快,这么快,又是新的一年了。特地翻出 ... -
TOMCAT常用优化
2011-12-12 16:04 667<p class="MsoNorm ... -
职场官话
2011-12-12 12:29 563官场充斥着官话,职场也满是官话,可能你没有注意到而已。 ...
相关推荐
### Java/JSP中文乱码问题解决心得 #### 一、Java中文问题的由来 Java作为一种广泛使用的编程语言,其核心设计目标之一就是提供良好的跨平台能力。为此,Java采用了Unicode作为其内部处理字符的标准,这使得Java...
此外,解决汉字乱码问题还需要注意如下几点心得: - 对于不同版本的Java,它们的默认编码可能不同,需要根据实际的Java版本进行相应的编码设置。 - 在进行国际化软件开发时,应该避免在系统中使用默认编码,而应该...
- **字符编码转换**:在处理中文等非英文字符时,经常会出现乱码问题。为了解决这个问题,可以采用特定的编码格式进行转换。例如,将字符串从ISO-8859-1编码转换为UTF-8编码: ```java String title = ""; byte[]...
* 学习 Servlet 需要掌握开发环境的配置、Servlet 的访问方式、post 和 get 的区别、处理中文乱码等概念 * 在学习 Servlet 时,需要掌握 Servlet 的生命周期、Session 的使用和管理 六、JSP * JSP 是一种 Java ...
4. **汉字处理**:在中文环境下,直接输出汉字可能会导致乱码。解决方案是将字符串转换为特定编码,如ISO8859_1,然后再进行输出。对于SQL语句中的汉字问题,可能需要使用特定数据库驱动(如IBM的JDBC驱动)并进行...
5. **解决乱码问题**: - 修改`conf/server.xml`文件中的`<Connector>`标签,添加`URIEncoding="GBK"`参数: ``` <Connector ... URIEncoding="GBK" ... /> ``` #### JFreeChart 配置 1. **部署JFreeChart**:...
此外,过滤器(Filter)用于处理如乱码、URL转义等问题,监听器(Listener)可以用来跟踪和管理应用程序的状态,如在线人数。 分页技术是Web开发中的另一个重要方面,常见的有前端分页、后端分页和数据库分页。每种...
S2SH(Struts2、Spring、Hibernate)是一个经典的Java Web开发框架组合,它整合了三个强大的开源组件,以提供模型-视图-控制器(MVC)架构的解决方案。对于初学者来说,理解并熟练掌握S2SH框架的搭建过程是迈向专业...
实验结束后,周媛娣认识到在进行数据查询时,有效的沟通和调试是解决问题的关键。通过这次实验,她加深了对DAO模式的理解,掌握了如何在实际项目中应用DAO模式进行数据库操作。 5. **总结**: 这个实验是一个很好...
为解决乱码问题,开发者需要确保在IDE、数据库、文件读写以及网络通信等环节统一使用正确的字符集,例如UTF-8。 7. **Eclipse配置与优化**: - **Eclipse Problem选项**: 这是指Eclipse的错误和警告提示设置,可以...
"个人信息管理系统答辩" 本资源是一个关于个人...15.心得体会:在编写程序之前分析需求很重要,编写代码时要有细心和耐心,遇到问题可以跟同学进行讨论,多方面的看待问题,加深对问题的理解,同时更快捷的解决问题。
过滤器可以用来处理乱码问题,实现URL重写,或者进行权限控制;监听器则可以用于跟踪用户的在线状态或统计网站访问量。 在数据库操作方面,通常会使用JDBC来连接和操作数据库,但随着ORM(对象关系映射)框架如...
**解答**: 使用`mb_substr()`函数,它可以正确处理多字节字符,避免截取中文字符串时出现乱码问题。 #### 十一、变量引用与赋值 **题目**: 分析以下代码执行结果。 **代码**: ```php $a = "hello"; $b = &$a; // ...
我想就我个人学习过程的心得和经验,写一篇比较全面的介绍文章。首先有两点是需要肯定的: 第一:XML肯定是未来的发展趋势,不论是网页设计师还是网络程序员,都应该及时学习和了解,等待只会让你失去机会; ...