精华内容
下载资源
问答
  • 开发中前台页面向后台传参,汉字乱码,看了好多网上的方法都解决不了,所以写了一个工具类,判断是乱码就转换,不乱码就不乱换,汉字字母符号自动判断。最后完美解决汉字乱码问题。
  • Java汉字乱码问题

    2017-12-15 20:56:00
    window->preferences->输入框输入“encod” 将text file encoding 从default改成other utf-8 同理,css,HTML,jsp,xml files的encoding都改成utf-8 即可。 转载于:...

    window->preferences->输入框输入“encod”

    将text file encoding 从default改成other utf-8

    同理,css,HTML,jsp,xml files的encoding都改成utf-8

    即可。

    转载于:https://www.cnblogs.com/huanjuemogu/p/8044808.html

    展开全文
  • java汉字乱码解决办法

    2015-03-15 14:13:00
    自从接触Java和JSP以来,就不断与Java的中文乱码问题打交道,现在终于得到了彻底的解决,现将我们的解决心得与大家共享。一、Java中文问题的由来Java的内核和class文件是基于unicode的,这使Java程序具有良好的跨...
    自从接触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将变量输出到页面时出现了乱码,可以通过设置response.setContentType( "text/html;charset=GBK ")或response.setContentType( "text/html;charset=gb2312 ")解决。  如果不想在每个文件里都写这样两句话,更简洁的办法是使用Servlet规范中的过虑器指定编码,过滤器的在web.xml中的典型配置和主要代码如下:  web.xml: 
    <filter>  <filter-name> CharacterEncodingFilter </filter-name>  <filter-class> net.vschool.web.CharacterEncodingFilter </filter-class>  <init-param>  <param-name> encoding </param-name>  <param-value> GBK </param-value>  </init-param>  </filter>  <filter-mapping>  <filter-name> CharacterEncodingFilter </filter-name>  <url-pattern> /* </url-pattern>  </filter-mapping> 
    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,在文件头加上 <%@   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将变量输出到页面时出现了乱码,可以通过设置response.setContentType( "text/html;charset=GBK ")或response.setContentType( "text/html;charset=gb2312 ")解决。  如果不想在每个文件里都写这样两句话,更简洁的办法是使用Servlet规范中的过虑器指定编码,过滤器的在web.xml中的典型配置和主要代码如下:  web.xml: 
    <filter>  <filter-name> CharacterEncodingFilter </filter-name>  <filter-class> net.vschool.web.CharacterEncodingFilter </filter-class>  <init-param>  <param-name> encoding </param-name>  <param-value> GBK </param-value>  </init-param>  </filter>  <filter-mapping>  <filter-name> CharacterEncodingFilter </filter-name>  <url-pattern> /* </url-pattern>  </filter-mapping> 
    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,在文件头加上 <%@   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将变量输出到页面时出现了乱码,可以通过设置response.setContentType( "text/html;charset=GBK ")或response.setContentType( "text/html;charset=gb2312 ")解决。  如果不想在每个文件里都写这样两句话,更简洁的办法是使用Servlet规范中的过虑器指定编码,过滤器的在web.xml中的典型配置和主要代码如下:  web.xml: 
    <filter>  <filter-name> CharacterEncodingFilter </filter-name>  <filter-class> net.vschool.web.CharacterEncodingFilter </filter-class>  <init-param>  <param-name> encoding </param-name>  <param-value> GBK </param-value>  </init-param>  </filter>  <filter-mapping>  <filter-name> CharacterEncodingFilter </filter-name>  <url-pattern> /* </url-pattern>  </filter-mapping> 
    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,在文件头加上 <%@   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将变量输出到页面时出现了乱码,可以通过设置response.setContentType( "text/html;charset=GBK ")或response.setContentType( "text/html;charset=gb2312 ")解决。  如果不想在每个文件里都写这样两句话,更简洁的办法是使用Servlet规范中的过虑器指定编码,过滤器的在web.xml中的典型配置和主要代码如下:  web.xml: 
    <filter>  <filter-name> CharacterEncodingFilter </filter-name>  <filter-class> net.vschool.web.CharacterEncodingFilter </filter-class>  <init-param>  <param-name> encoding </param-name>  <param-value> GBK </param-value>  </init-param>  </filter>  <filter-mapping>  <filter-name> CharacterEncodingFilter </filter-name>  <url-pattern> /* </url-pattern>  </filter-mapping> 
    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,在文件头加上 <%@   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将变量输出到页面时出现了乱码,可以通过设置response.setContentType( "text/html;charset=GBK ")或response.setContentType( "text/html;charset=gb2312 ")解决。  如果不想在每个文件里都写这样两句话,更简洁的办法是使用Servlet规范中的过虑器指定编码,过滤器的在web.xml中的典型配置和主要代码如下:  web.xml: 
    <filter>  <filter-name> CharacterEncodingFilter </filter-name>  <filter-class> net.vschool.web.CharacterEncodingFilter </filter-class>  <init-param>  <param-name> encoding </param-name>  <param-value> GBK </param-value>  </init-param>  </filter>  <filter-mapping>  <filter-name> CharacterEncodingFilter </filter-name>  <url-pattern> /* </url-pattern>  </filter-mapping> 
    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://www.cnblogs.com/jkma1007/p/4339714.html

    展开全文
  • * @{#} StrTets.java Create on 2020年8月17日 下午4:44:13 * * Copyright (c) 2013 by Logan. */ package test.url; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; ...
    /**     
    
     * @{#} StrTets.java Create on 2020年8月17日 下午4:44:13     
    
     *     
    
     * Copyright (c) 2013 by Logan.     
    
     */     
    
    package test.url;
    
    import java.io.UnsupportedEncodingException;
    import java.net.URLDecoder;
    import java.net.URLEncoder;
    
    /**     
    
    * @author jiangcl    
    
    * @version 1.0     
    * @desc
    
    */
    
    public class StrTest {
    	
    	public static void main(String[] args) throws UnsupportedEncodingException {
    		
    		
    		String st = "我的测试流程";
    		st = URLEncoder.encode(st, "utf-8");
    		
    		System.out.println(st);
    		
    		st =  URLDecoder.decode(st, "utf-8");
    		
    		System.out.println(st);
    		
    	}
    
    }
    
    
    展开全文
  • Java汉字乱码问题

    2016-08-06 16:56:24
    为什么汉字在使用字节流处理数据是会出现乱码, 因为汉字在内存中是以两个字节的char类型的形式存储的,而InputStream和OotputStream 在读写数据时是一个字节一个字节处理的,故汉字不能一次就读入一个字,所以会...
    为什么汉字在使用字节流处理数据是会出现乱码,
    因为汉字在内存中是以两个字节的char类型的形式存储的,而InputStream和OutputStream
    在读写数据时是一个字节一个字节处理的,故汉字不能一次就读入一个字,所以会出现乱码
    处理方法是使用Reader 和Writer方式读写。Reader 和 Writer 以字符为单位读写数据
    展开全文
  • java控制台中文汉字乱码

    万次阅读 2017-10-24 07:41:45
    java资源的编码都是utf8,使用utf8编译。但是控制台输出的时候,中文汉字还是会出现乱码
  • Java字节流读取汉字乱码

    千次阅读 2019-04-03 16:20:09
    关于Java字节流读取汉字乱码探究 问题概述 当我们尝试使用字节流对汉字进行写入读取操作时,可能出现乱码。其根本原因在于编码标准不同。汉字采用gbk,而idea使用UTF-8。在这样的前提下,开始讨论本文题。 使用...
  • java配置文件存储汉字乱码问题 在项目中,发现当在配置文件中配置中文的时候,读出来的配置是乱码,这里提供两种解决方案
  • JAVA:Print汉字乱码问题

    千次阅读 热门讨论 2018-04-18 21:02:45
     Java语言是目前的主流计算机语言之一,作为一个小白程序员一定要从最基础的学起,但是问题总是接二连三的到来,今天就给大家分享一下Print中文出现乱码的问题。 错误截图: 源码: public class TestPrint{...
  • java 汉字保存到mysql 乱码

    千次阅读 2014-07-04 11:07:35
    java 汉字保存到mysql 乱码 保存之前zheng
  • 相当郁闷,网上的方案都解决不了我的问题,最后还是无意间试出来的, ... 选择宋体(不要选择英文字体,如times new roman),否则java文件里面的汉字乱码 工具-》选项-》字体和颜色——》选择宋体 ...
  • js向java后台传汉字乱码的解决方法

    千次阅读 2017-11-12 17:55:21
    在开发项目的过程中,遇到了js向Java后台传汉字时出现乱码的情况。 解决的大体思想是,在js中进行编码,然后在java后台中进行解码。 前台编码 var str = encodeURI("将要传的汉字"); 12 后台解码 str = ...
  • 在Linux下Java应用程序汉字乱码,不是操作系统的问题,而是JVM的font库问题。下面是我的解决办法: 1. 在java目录下的jre/lib/fonts下建立文件夹chinese  mkdir /usr/lib/jvm/java-6-sun-1.6.0.16/jre/lib/fonts/...
  • 遇到疑难杂症,求解决~~~~~~~~~真心不会,也百度不出来,求解答 oracle10g dblink(字符集 NLS_CHARACTERSET=ZHS16GBK,NLS_NCHAR_...在oracle服务器装上sql developer查询汉字也是乱码。 用我的电脑...
  • java文件运行时汉字乱码问题

    千次阅读 2013-10-12 18:35:19
    今天在myeclipse中执行java程序时发现java程序的源代码的文字格式都是UTF-8格式,没有问题,但是执行程序时汉字总是会变成小方框,经过各种摸索,才发现原来只需要把Run Configurations中Common选项下的Console ...
  • Dojo request (js ajax)向java后台传汉字乱码的通用解决方法在开发项目的过程中,遇到了js向Java后台传汉字时出现乱码的情况。 解决的大体思想是,在js中进行编码,然后在java后台中进行解码。前台编码var str = ...
  • 修改tomcat的server.xml中的connector,添加URLEncoding="UTF-8":&lt;Connector connectionTimeout="20000" port="8080" protocol="... redirectPort="...
  • 在servlet类中的get,post最前面加上req.setCharacterEncoding("UTF-8"); resp.setCharacterEncoding(...对接收到的汉字字符串转码 String name = req.getParameter("name"); String deptName = req.getParameter("dep
  • java socket通信中汉字乱码问题

    千次阅读 2014-09-19 00:57:30
  • String name="王大锤";... /*URLEncoder.encode(name,"utf-8"):因为cookie中是不支持直接保存汉字的,所以 * 需要将汉字用encode()方法进行编码 * * */ * Cookie ck1=new Cookie("username", URLEncoder.e
  • 1、页面无法显示中文 将jsp文件开始处设为<...2、页面传输乱码 添加过滤器 新建一个类,包名设为com.netshuai,类名为CharacterEncodingFilter CharacterEncodingFilter.java代码如下: ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,041
精华内容 416
关键字:

java汉字乱码

java 订阅