java中文输出乱码_java汉字乱码解决办法

java中文输出乱码_java汉字乱码解决办法自从接触Java和JSP以来,就不断与Java的中文乱码问题打交道,现在终于得到了彻底的解决,现将我们的解决心得与大家共享。一、Java中文问题的由来Java的内核和class文件是基于unicode的,这使Java程序具有良好的跨平台性,但也带来了一些中文乱码问题的麻烦。原因主要有两方面,Java和JSP文件本身编译时产生的乱码问题和Java程序于其他媒介交互产生的乱码问题。首先Java(包括J…

大家好,又见面了,我是你们的朋友全栈君。

自从接触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     encoding   GBK         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     encoding   GBK         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     encoding   GBK         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     encoding   GBK         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     encoding   GBK         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   );  终于解决了这个乱码问题。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/156191.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • flowable 流程引擎总结

    flowable 流程引擎总结最近公司使用Flowable开发了自己的OA系统,因此对Flowable的相关内容进行如下总结一、Flowable是什么目前最新版是Flowable6.4.2(2019年07月26日)官网地址:https://www.flowable.org/github地址:https://github.com/flowableFlowable是一个使用Java编写的轻量级业务流程引擎,使用ApacheV2license协议开源。2016年10月,Activiti工作流引.

    2022年10月20日
    3
  • 滑块验证码的识别

    滑块验证码的识别滑块验证码的识别前言一 滑块验证码的形式二 采用的方法 1 滑块图 背景图切分 2 模板匹配总结前言最近在一个比价的公司实习 公司里面主要使用爬虫来获取一件商品在其他平台的价格 但是在大部分的时候别的平台不愿意把价格数据直接给你 他们会进行一些反爬的手段 例如使用验证码 验证码有很多的类型 今天主要来说说遇到的滑块验证码的识别 一 滑块验证码的形式滑块验证码的形式也很多 大多都类似下面这样的 一般类似这样的验证码已经有很成熟的解决方案了 比如 js 激活成功教程 图像识别激活成功教程等等 但是我在项目中遇到的验证码有一

    2025年8月9日
    4
  • RS232电平转换电路_rs422转rs232

    RS232电平转换电路_rs422转rs232介绍:SP3232EEN是RS-232电平转换芯片,与之相近的芯片还有SP3222,其区别见下表: 芯片特性:1、3.0V-5.5V供电;2、120kbps传输率;3、15kv空气放电;4、8kv接触放电。 型号选择: 内部结构图: 典型应用电路:  原创性文章,转载请注明出处CSDN:http://blog.csdn…

    2022年8月10日
    10
  • SQL学习(二):concat函数(连接字符串)

    SQL学习(二):concat函数(连接字符串)concat函数(连接字符串):使用方法:CONCAT(str1,str2,…)返回结果为连接参数产生的字符串。如有任何一个参数为NULL,则返回值为NULL。注意:如果所有参数均为非二进制字符串,则结果为非二进制字符串。如果自变量中含有任一二进制字符串,则结果为一个二进制字符串。一个数字参数被转化为与之相等的二进制字符串格式;若要避免这种情况,可使用显式类型cast,例如:SELECTCONCAT(CAST(int_colASCHAR),char_col)concat函数

    2022年5月3日
    124
  • t276芯片(芯片st是什么意思)

    ST7789V2是一个单芯片TFT-LCD驱动器。该芯片可以直接连接到外部MCU,支持并行8080系列的8位/9位/16位/18位接口,也支持SPI串行通讯接口。显示数据可以存储在240x320x18bits的片上显示数据RAM中。它可以在没有外部操作时钟的情况下执行显示数据RAM读写操作,以尽量减少功耗。并行接口占用外部MCU芯片引脚较多,但其通讯速率较快,一般只在需要高速刷新及MCU资源比较丰富的场合使用。SPI串行通讯接口占用MCU芯片引脚较少,通讯速率相对并行接口较慢,但因其占用MCU引脚.

    2022年4月9日
    159
  • 逆变器运用到的c语言算法,详解六种逆变电源的控制算法[通俗易懂]

    逆变器运用到的c语言算法,详解六种逆变电源的控制算法[通俗易懂]在电路中将直流电转换为交流电的过程称之为逆变,这种转换通常通过逆变电源来实现。这就涉及到在逆变过程中的控制算法问题。本文引用地址:http://www.eepw.com.cn/article/201710/366918.htm只有掌握了逆变电源的控制算法,才能真正意义上的掌握逆变电源的原理和运行方式,从而方便设计。在本篇文章当中,小编将对逆变电源的控制算法进行总结,帮助大家进一步掌握逆变电源的相关…

    2022年5月17日
    68

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号