Java/JSP中文乱码问题解决

news/2024/7/4 13:10:24

Java/JSP中文乱码问题解决

自从接触Java和JSP以来,就不断与Java的中文乱码问题打交道,现在终于得到了彻底的解决,现将我们的解决心得与大家共享。

一、Java中文问题的由来

Java的内核和class文件是基于unicode的,这使Java程序具有良好的跨平台性,但也带来了一些中文乱码问题的麻烦。原因主要有两方面,Java和JSP文件本身编译时产生的乱码问题和Java程序于其他媒介交互产生的乱码问题。

首先Java(包括JSP)源文件中很可能包含有中文,而Java和JSP源文件的保存方式是基于字节流的,如果Java和JSP编译成class文件过程中,使用的编码方式与源文件的编码不一致,就会出现乱码。基于这种乱码,建议在Java文件中尽量不要写中文(注释部分不参与编译,写中文没关系),如果必须写的话,尽量手动带参数-ecoding GBK或-ecoding gb2312编译;对于JSP,在文件头加上<%@ page contentType="text/html;charset=GBK"%>或<%@ page contentType="text/html;charset=gb2312"%>基本上就能解决这类乱码问题。

本文要重点讨论的是第二类乱码,即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服务器如WEBSPHERE会自动转码,有些JSP服务器如tomcat还可以通过配置过滤器的方式来解决:
<web-app>
<filter>
<filter-name>RequestFilter</filter-name>
<filter-class>net.golden.uirs.util.RequestFilter</filter-class>
<init-param>
<param-name>charset</param-name>
<param-value>gb2312</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>RequestFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
</web-app>

如果在JSP将变量输出到页面时出现了乱码,可以通过设置response.setContentType("text/html;charset=GBK")或response.setContentType("text/html;charset=gb2312")解决。

2、Java与数据库之间的乱码
大部分数据库都支持以unicode编码方式,所以解决Java与数据库之间的乱码问题比较明智的方式是直接使用unicode编码与数据库交互。很多数据库驱动自动支持unicode,如Microsoft的SQLServer驱动。其他大部分数据库驱动,可以在驱动的url参数中指定,如如mm的mysql驱动:jdbc:mysql://localhost/WEBCL2DB?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读取txt文件.以及解决其乱码问题

java的io操作文件中数txt文件最简单了..
一般在读写时时候要注意乱码问题..这个问题数简单也不简单..
得从创建记事本开始说起.
   有两种创建方式:
      一、是程序创建:创建的时候回规定其编码方式
      二、是在桌面右键 新建 记事本。这时候一般我们都不会可以的去选择其编码方式
所以就会出现乱码的问题...

/*-------------------------------------------------------------------------*/
import java.io.*;
public class ReadWriteFile {

public static void main(String args[])
{
   try
   {
    File read=new File("E://test.txt");
    File write=new File("E://test1.txt");
    BufferedReader br=new BufferedReader(new FileReader(read));
    BufferedWriter bw=new BufferedWriter(new FileWriter(write));
    String temp=null;
    temp=br.readLine();
    while(temp!=null)
    {
     //System.out.println("写了一行");
     bw.write(temp+"/r/n");
     temp=br.readLine();
    }
    bw.close();
    br.close();
   }
   catch(FileNotFoundException e)
   {
    System.out.println("文件没有找到异常");
   }
   catch(IOException e)
   {
    System.out.println(e.getMessage());
   }
}
}

/*-------------------------------------------------------------------------*/
import java.io.*;
public class ReadWriteFile {

public static void main(String args[])
{
   try
   {
    File read=new File("E://test.txt");
    File write=new File("E://test1.txt");

    BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(read), "GBK"));
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(write), "GBK"));
    String temp=null;
    temp=br.readLine();
    while(temp!=null)
    {
     //System.out.println("写了一行");
     bw.write(temp+"/r/n");
     temp=br.readLine();
    }
    bw.close();
    br.close();
   }
   catch(FileNotFoundException e)
   {
    System.out.println("文件没有找到异常");
   }
   catch(IOException e)
   {
    System.out.println(e.getMessage());
   }
}
}

/*----------------------------------------------------------------------------*/
这样改 大功告成.......................


http://www.niftyadmin.cn/n/3978530.html

相关文章

JAVA简单考试题

JAVA考试题一、 填空题&#xff1a;&#xff08;15个2&#xff09;1、 面向对象的特征有&#xff08;至少写出三个&#xff09;&#xff1a; 封装、继承、多态 2、 Map采用 哈希算法 机制放置数据。3、 …

Collection接口和Map接口的主要实现类

Collection接口和Map接口的主要实现类 Collection接口 Collection是最基本的集合接口&#xff0c;一个Collection代表一组Object&#xff0c;即Collection的元素&#xff08;Elements&#xff09;。一些Collection允许相同的元素而另一些不行。一些能排序而另一些不行。Java …

在Linux下使用MySQL简介

在Linux下使用MySQL简介一、安装Mysql1、下载MySQL的安装文件安装MySQL需要下面两个文件&#xff1a;MySQL-server-4.0.16-0.i386.rpm   MySQL-client-4.0.16-0.i386.rpm下载地址为&#xff1a;http://www.mysql.com/downloads/mysql-4.0.html&#xff0c;打开此网页&#x…

三道编程题

四、 编程题1. 构造一个类来描述屏幕上的一个点&#xff0c;该类的构成包括点的x和y两个坐标&#xff0c;以及一些对点进行的操作&#xff0c;包括&#xff1a;取得点的坐标值&#xff0c;对点的坐标进行赋值&#xff0c;编写应用程序生成该类的对象并对其进行操作。 2. 编写…

海信的笔试题

数字推理题和逻辑推导题(供参考) 一:数字推理 答题说明&#xff1a;请对题项中给出的数列进行观察和分析&#xff0c;并根据其排列规律推导出空缺位置上的数字&#xff0c;做出选择&#xff0c;测试时间15分钟。 第1题:1, 3, 3, 9, ( ) A.18 B.21 C.27 D.81 第2题:在面积相等的…

UML 实践——用例图、顺序图、状态图、类图、包图、协作图

文章分类:综合技术 UML 实践——用例图、顺序图、状态图、类图、包图、协作图 面向对象的问题的处理的关键是建模问题。建模可以把在复杂世界的许多重要的细节给抽象出。许多建模工具封装了UML&#xff08;也就是Unified Modeling Language™&#xff09;&#xff0c;这篇课程的…

泛化-关联-依赖-聚合

http://www.javaeye.com/topic/37302 类与类之间的关系对于理解面向对象具有很重要的作用&#xff0c;以前在面试的时候也经常被问到这个问题&#xff0c;在这里我就介绍一下。类与类之间存在以下关系:(1)泛化(Generalization)(2)关联(Association)(3)依赖(Dependency)(4)聚合…

IOC和AOP的一些基本概念

IOC和AOP的一些基本概念介绍 IOC 介绍 IOC 一、什么是IOC IoC就是Inversion of Control&#xff0c;控制反转。在Java开发中&#xff0c;IoC意味着将你设计好的类交给系统去控制&#xff0c;而不是在你的类内部控制。这称为控制反转。 下面我们以几个例子来说明什么是IoC 假…