精华内容
下载资源
问答
  • 在基于Java的编程中,经常会碰到汉字的处里及显示的问题,比如一大堆乱码或问号。这是因为JAVA中默认的编码方式是UNICODE,而中国人通常使用的文件和DB都是基于GB2312或者BIG5等编码,故会出现此问题。1、在网页中...

    1c4bd588f855abac0ded9454c12c07af.png

    在基于Java的编程中,经常会碰到汉字的处里及显示的问题,比如一大堆乱码或问号。

    这是因为JAVA中默认的编码方式是UNICODE,而中国人通常使用的文件和DB都是基于GB2312或者BIG5等编码,故会出现此问题。

    1、在网页中输出中文。

    JAVA在网络传输中使用的编码是"ISO-8859-1",故在输出时需要进行转化,如:String str="中文"; str=new String(str.getBytes("GB2312"),"8859_1");

    但假如在编译程序时,使用的编码是“GB2312”,且在中文平台上运行此程序,不会出现此问题,一定要注重。

    2、从参数中读取中文 这正好与在网页中输出相反如:str=new String(str.getBytes("8859_1"),"GB2312");

    3、操作DB中的中文问题 一个较简单的方法是:在“控制面扳”中,把“区域”设置为“英语(美国)”。

    假如还会出现乱码,还可进行如下设置:

    取中文时:str=new String(str.getBytes("GB2312"));

    向DB中输入中文:str=new String(str.getBytes("ISO-8859-1"));

    4、在jsp中的中文解决:

    在“控制面扳”中,把“区域”设置为“英语(美国)”.

    在JSP页面中加入: 假如还不行正常显示,

    则还要进行下面的转换: 如:name=new String(name.getBytes("ISO-8859-1"),"GBK");

    就不会出现中文问题了。

    展开全文
  • 开发中前台页面向后台传参,汉字乱码,看了好多网上的方法都解决不了,所以写了一个工具类,判断是乱码就转换,不乱码就不乱换,汉字字母符号自动判断。最后完美解决汉字乱码问题。
  • java汉字乱码解决办法

    千次阅读 2021-02-12 16:30:27
    自从接触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,在文件头加上 或 基本上就能解决这类乱码问题。

    本文要重点讨论的是第二类乱码,即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   );  终于解决了这个乱码问题。

    展开全文
  • Java中文乱码问题

    2021-02-28 15:59:20
    一、MyEclipse 下的java文件中文乱码问题(MyEclipse6.5):解决方法一:Window--àPreferences… --àGeneral --àContent Types --àText --àJava Source File 中Default encoding 改写成UTF-8(你所需的编码类型) ...

    一、MyEclipse 下的java文件中文乱码问题(MyEclipse

    6.5):

    解决方法一:Window

    --à

    Preferences… --à

    General --àContent Types --à

    Text --à

    Java Source File 中Default encoding 改写成UTF-8(你所需的编码类型) 然后Update,OK确定就可以了。

    a4c26d1e5885305701be709a3d33442f.png

    二、

    1 、编码

    编码比较常用的有:

    UTF-8 , GBK ,GB2312 , ISO-8859-1 ,除了iso-8859-1 之外的其它三个编码都能很好的支持中文,但它们都兼容 ISO-8859-1 的编码(就是说无论编码怎么改变,只要是

    ISO-8859-1

    中的字符,永远不会出现乱码)。

    GB2312 是中国规定的汉字编码,也可以说是简体中文的字符集编码

    GBK 是 GB2312 的扩展 , 除了兼容 GB2312 外,它还能显示繁体中文,还有日文的假名 ;

    UTF-8也支持中文,但却与 GB 码不兼容(编码值不同)。UTF-8 使用的是可变长的 UNICODE 编码,编码可能是 1 位 16

    进制(即ISO-8859-1

    中的字符,其编码也是相同的)也有可能是 2 位或

    3 位的 16 进制。 UTF-8 的优点是: 1 、 与 CPU

    字节顺序无关 , 可以在不同平台之间交流。

    2 、容错能力高 , 任何一个字节损坏后 , 最多只会导致一个编码码位损失 , 不会链锁错误 ( 如 GB

    码错一个字节就会整行乱码)

    ,所以在国际化处理中基本都是建议使用 UTF-8

    作为编码。

    2、文件的编码

    虽然说只要设置了正确的编码就可以使字符正确显示了,但如果忽略了文件保存时的编码的话,那可是会让你走进迷雾中的。

    文件编码最常使用的有两种:ANSI和UTF-8, ANSI就是我们保存文件时使用的默认编码,而UTF-8则需自己设置。对于编码的改变,我使用的工具是NOTEPAD和ECLIPSE,NOTEPAD使用最简单,只要打开文件后在另存为中选择相应的编码就行了,而且它对编码的支持非常好。而在其它的编辑器中,默认保存的内容都是GB2312或者GBK(NOTEPAD中对应ANSI).而根据前面所说的UTF-8和GBK,GB2312等的编码值是不同的这一点,可以知道,如果文件使用了UTF-8,那么字符编码就必须使用UTF-8,否则编码值的不同就可能造成乱码。而这也就是为什么那么多的人使用了UTF-8编码后还会产生乱码的根本原因。(JS和JSP都是这个道理)

    3、资源文件的乱码解决方案

    资源文件谁都知道是国际化支持不可或缺的一部分,资源文件的乱码原因也是因为使用了UTF-8做为JSP编码后,没有相应地改变资源文件的文件编码造成的,所以只要对资源文件保存的编码进行更正后,乱码问题也就解决了。当然,你的中文要使用

    native2ascii

    命令进行正确的转换。

    4、调用JS时,JS内容乱码的解决方案。

    其实JS的乱码还是跟文件的编码有关系的,如果JS中有中文的话,那JS文件保存的编码就必须跟调用此JS的页面编码相同,否则,你的所有中文都要从JSP页面传给JS才会显示正常。

    5、AJAX提交数据乱码,返回数据乱码的解决方案

    随着AJAX的流行,乱码问题也开始困扰着许多刚开始使用它的程序员,万变不离其宗,AJAX的乱码问题自然跟编码有关了,我想很多人想到了对文件编码进行设置,并且在接数据时设置了requet的编码,在返回的数据时设置了response的编码一切都以为会很顺利,可是这一切都是徒劳无功的。解决的方法其实很简单,而且其答案就在我们之前处理的JSP乱码之中。让我们先看一下AJAX的经典请求代码

    程序代码:

    xmlhttp.open( "post", url, async );

    xmlhttp.setRequestHeader( "Content-Type",

    "text/html" );

    xmlhttp.send( params );

    setRequestHeader并不是不变的,也没人想过去改它,而问题就正好出在这个地方。回想一个JSP页面内容的编码设置,其中有这么一节:

    程序代码:

    contentType="text/html;charset=UTF-8";

    现在知道问题了吧,所以我们要把第二句代码改为:

    程序代码:

    xmlhttp.setRequestHeader( "Content-Type",

    "text/html;charset=UTF-8" );

    最后别忘了在返回数据时也设置上:

    程序代码:

    response.setContentType( "text/xml"

    );

    response.setCharacterEncoding( "UTF-8"

    );

    如果要问为什么的话,其实我们可以把xmlhttp看成是一个临时页面,它由浏览器动态生成,主要作用是在后台获得请求的数据(可以看成是一个高级的iframe)。所以对于普通页面设置的编码,对它也要同样设置。而在servlet中返回数据为什么要设置contentType和encoding其道理也是一样的。众所周知,jsp的最后形态就是servlet,而jsp页首设置的那个内容其实也就是让生成的servlet中生成这么两句话:

    response.setContentType( "text/html" );

    response.setCharacterEncoding( "UTF-8" );

    而pageEncoding则是跟jvm说明了这个页面的内容要使用什么编码保存(这跟之后生成的CLASS有关系)。所以在servlet设置response的编码也是理所当然的了。

    三、大家都知道,xmlhttp在通信时采用的是utf编码,而国内很多网页的信息都是采用gbk编码,所以当直接通过ajax去连接网页,并将获取到的信息直接显示的话就会出现乱码的现象,有些时候无法改变服务器端网页的编码(例如获取别的网站的天气预报信息),在这种时候就只能在客户端通过js做编码的工作了,下面这段js就是用于将服务器端返回的gbk编码字符串转换为utf编码字符串:

    最后是项目中出现的乱码问题及解决方法:

    问题描述:使用javascript传递参数的方式将中文参数传给java中的action部件。页面编码为GBK,在javascript用httprequest传递时发生参数乱码的变动的问题,应该是xmlhttp的content-type的问题,但是我们原则上不改变原有代码,因此采用了以下办法。

    1,不改变页面编码,仍然维持编码格式为GBK。

    2,在javascript附加参数时对参数进行一次转码.采用javascript的方法encodeURI对中文参数进行转换。

    3,维持原有xmlhttprequest的content-type不变仍然为:http_request.setRequestHeader("Content-Type","application/x-www-form-urlencoded");

    4,增加一个工具类进行转码处理,增加方法:

    程序代码

    public

    static String isoToUTF8(String str) {

    try

    {

    if

    (!str.equals("")) {

    URLEncoder.encode(str, "gbk");

    str=

    new String(str.getBytes("gbk"), "utf8").toString();

    }

    }

    catch (UnsupportedEncodingException e) {

    m_logger.error("occurs a exception when change the

    coding to UTF8:", e);

    }

    return

    str;

    }

    5,修改action中获取request参数的部分代码

    ClassName.isoToUTF8(request.getParameter("parameterName"));

    展开全文
  • java中文乱码大全

    2015-01-22 14:20:34
    本资源用来解决java中文乱码问题,有很多解决java中文乱码的方法
  • java解决中文乱码问题

    2013-05-21 10:09:15
    java解决中文乱码问题
  • java中文乱码解决总结

    千次阅读 2021-02-25 20:14:38
    为什么说乱码是中国程序员无法避免的话题呢?这个首先要从编码机制上说起,大家都是中文和英文的编码格式不是一样,解码也是不一样的!如果中国的程序员不会遇到乱码,那么只有使用汉语编程。汉语编程是怎么回事我也...

    为什么说乱码是中国程序员无法避免的话题呢?这个首先要从编码机制上说起,大家都是中文和英文的编码格式不是一样,解码也是不一样的!如果中国的程序员不会遇到乱码,那么只有使用汉语编程。汉语编程是怎么回事我也不大清楚,应该是前年吧,我一朋友给我介绍汉语编程,怎么不错不错?当时因为学习忙没去关注这个,等我闲了,那个朋友不弄这个,问他他也不说不大清楚,最后自己对这个学习也不了了之了。

    今天我写这个不是讲解中英文之间的差距,解码等,我是将我在这几年工作遇到各种各样的乱码的解决方法,总结一样,也希望大家能把自己晕倒解决乱码的方法都说出来,咱们弄一个解决乱码的“葵花宝典”。

    对于Java由于默认的编码方式是 UNICODE,所以用中文也易出问题,常见的解决是

    String s2 = new String(s1.getBytes(“ISO-8859-1”),”GBK”);

    1、utf8解决JSP中文乱码问题

    一般说来在每个页面的开始处,加入:

    pageEncoding="UTF-8"%>

    request.setCharacterEncoding("UTF-8");

    %>

    charset=UTF-8  的作用是指定JSP向客户端输出的编码方式为“UTF-8”

    pageEncoding="UTF-8"  为了让JSP引擎能正确地解码含有中文字符的JSP页面,这在LINUX中很有效

    request.setCharacterEncoding("UTF-8"); 是对请求进行了中文编码

    有时,这样仍不能解决问题,还需要这样处理一下:

    String msg = request.getParameter("message");

    String str=new String(msg.getBytes("ISO-8859-1"),"UTF-8");

    out.println(st);

    2、Tomcat 5.5 中文乱码

    )只要把%TOMCAT安装目录%/   webapps/servlets-examples/WEB-INF/classes/filters/SetCharacterEncodingFilter.class文件拷到你的webapp目录/filters下,如果没有filters目录,就创建一个。

    2)在你的web.xml里加入如下几行:  

    Set   Character   Encoding

    filters.SetCharacterEncodingFilter

    encoding

    GBK

    Set   Character   Encoding

    /*

    3)完成.

    2   get方式的解决办法

    1)   打开tomcat的server.xml文件,找到区块,加入如下一行:

    URIEncoding=”GBK”

    完整的应如下:

    port="80"   maxThreads="150"   minSpareThreads="25"   maxSpareThreads="75"

    enableLookups="false"   redirectPort="8443"   acceptCount="100"

    debug="0"   connectionTimeout="20000"

    disableUploadTimeout="true"

    URIEncoding="GBK"

    />

    2)重启tomcat,一切OK。

    3、xmlHttpRequest中文问题

    页面jsp用的GBK编码

    代码

    javascript部分

    代码

    function addFracasReport() {

    var url="controler?actionId=0_06_03_01&actionFlag=0010";

    var urlmsg="&reportId="+fracasReport1.textReportId.value;  //故障报告表编号

    var xmlHttp=Common.createXMLHttpRequest();

    xmlHttp.onreadystatechange = Common.getReadyStateHandler(xmlHttp, eval("turnAnalyPage"));

    xmlHttp.open("POST",url,true);

    xmlHttp.setRequestHeader( " Content-Type " , " application/x-www-form-urlencoded);

    xmlHttp.send(urlmsg);

    }

    后台java中获得的reportId是乱码,不知道该怎么转,主要是不知道xmlHttp.send(urlmsg);以后是什么编码?在后面用java来转,试了几种,都没有成功,其中有:

    代码

    public static String UTF_8ToGBK(String str) {

    try {

    return new String(str.getBytes("UTF-8"), "GBK");

    } catch (Exception ex) {

    return null;

    }

    }

    public static String UTF8ToGBK(String str) {

    try {

    return new String(str.getBytes("UTF-16BE"), "GBK");

    } catch (Exception ex) {

    return null;

    }

    }

    public static String GBK(String str) {

    try {

    return new String(str.getBytes("GBK"),"GBK");

    } catch (Exception ex) {

    return null;

    }

    }

    public static String getStr(String str) {

    try {

    String temp_p = str;

    String temp = new String(temp_p.getBytes("ISO8859_1"), "GBK");

    temp = sqlStrchop(temp);

    return temp;

    } catch (Exception e) {

    return null;

    }

    }

    4、JDBC ODBC Bridge的Bug及其解决方法

    在编写一数据库管理程序时,发现JDBC-ODBC Bridge存在不易发现的Bug。在向数据表插入数据时,如果为英文字符,存储内容完全正确,如果存入中文字符,部分数据库只能存储前七八个中文字符,其他内容被截去,导致存储内容的不完整(有些数据库不存在这个问题,如Sybase SQL Anywhere 5.0。JDBC-ODBC Bridge还存在无法建表的Bug)。

    对于广大需要存储中文信息的Java程序员来说,这可是一个不好的消息。要么改用其他语言编程,要么选择其他价格昂贵的数据库产品。“一次编写,到处运行”的目标,也大打折扣。能不能采用变通的方法,将中文信息进行处理后再存储来解决这个问题呢?答案是肯定的。

    解决问题的具体思路、方法

    Java采用Unicode码编码方式,中英文字符均采用16bit存储。既然存储英文信息是正确的,根据一定规则,将中文信息转换成英文信息后存储,自然不会出现截尾现象。读取信息时再进行逆向操作,将英文信息还原成中文信息即可。由GB2312编码规则可知,汉字一般为二个高位为1的ASCII码,在转换时将一个汉字的二个高位1去掉,还原时再将二个高位1加上。为了处理含有英文字符的中文字串,对英文字符则需要加上一个Byte 0标记。以下提供的两个公用静态方法,可加入任何一个类中使用。

    将中英文字串转换成纯英文字串

    public static String toTureAsciiStr(String str){

    StringBuffer sb = new StringBuffer();

    byte[] bt = str.getBytes();

    for(int i =0 ;i〈bt.length;i++){

    if(bt[i]〈0){

    //是汉字去高位1

    sb.append((char)(bt[i]&&0×7f));

    }else{//是英文字符 补0作记录

    sb.append((char)0);

    sb.append((char)bt[i]);

    }

    }

    return sb.toString();

    }

    将经转换的字串还原

    public static String unToTrueAsciiStr(String str){

    byte[] bt = str.getBytes();

    int i,l=0,length = bt.length,j=0;

    for(i = 0;i〈length;i++){

    if(bt[i] == 0){

    l++;

    }

    }

    byte []bt2 = new byte[length-l];

    for(i =0 ;i〈length;i++){

    if(bt[i] == 0){

    i++;

    bt2[j] = bt[i];

    }else{

    bt2[j] = (byte)(bt[i]|0×80);

    }

    j++;

    }

    String tt = new String(bt2);

    return tt;

    }

    上例在实际编程中效果很好,只是存储的中文信息需要经过同样处理,才能被其他系统使用。而且如果中文字串出现英文字符,实际上增加了额外的存储空间。

    5、Solaris下Servlet编程的中文问题及解决办法在使用Java开发Internet上的一个应用系统时,发现在Windows下调试完全正常的Servlet,上传到Solaris 服务器上,运行却出现故障——返回的网页不能显示中文,应为中文的信息全为乱码;用中文信息做关键字,不能正确检索数据库。后来采用加入检查代码等方法探知故障原因如下:

    显示乱码主要是因为通过类 HttpServletResponse提供的方法setContentType 无法改变返回给客户的数据的编码方式,正确的编码方式应为GB2312或者GBK,而事实上为缺省的ISO8859-1。无法检索中文信息则是因为,客户提交的中文信息经浏览器编码到达服务器后,Servlet无法将其正确解码。

    举例说明显示乱码解决方法

    Servlet 一般通常做法如下:

    public class ZldTestServlet extends HttpServlet {

    public void doGet (HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException{

    //在使用 Writer向浏览器返回数据前,设置 content-type header ,在这里设置相应的字符集gb2312

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

    PrintWriter out = response.getWriter(); //*

    // 正式返回数据

    out.println("〈html〉〈head〉〈title〉Servlet test〈/title〉〈/head〉" );

    out.println("这是一个测试页!");

    out.println("〈/body〉〈/html〉");

    out.close();

    }

    }

    解决页面显示乱码问题,需将*处代码换成如下内容:

    PrintWriter out = new PrintWriter(new OutputStreamWriter(response.getOutputStream(),"gb2312"));

    Solaris中文信息检索问题的解决

    浏览器利用表单向服务器提交信息时,一般采用x-www-form-urlencoded 的MIME格式对数据进行编码。如果使用get方法,参数名称和参数值经编码后附加在URL后,在Java中称作查询串(query string)。

    在Servlet程序中,如果采用ServletRequest的方法getParameter取得参数值,在Solaris环境下,对汉字却不能正确解码。因而无法正确检索数据库。

    在Java 1.2的包——java.net中提供了URLEncode和URLDecode类。类URLEncode提供了按x-www-form-urlencoded格式对给定串进行转换的方法。类URLEncode则提供了逆方法。

    6、Common Mail乱码问题

    common mail是一个小而方便的mail包,他实现了对Java Mail的封装,使用起来十分的方便,但是我在使用他的时候发现,使用纯文本的内容发送,结果是乱码,代码如下:

    public class TestCommonMail {

    public static void main(String[] args) throws EmailException, MessagingException {

    SimpleEmail email = new SimpleEmail();

    email.setCharset("GB2312");

    email.setHostName("smtp.163.com");

    email.setSubject("test");

    email.addTo("

    分析了一下commons mail的源码找到了原因。源码如下:

    public class SimpleEmail extends Email

    {

    public Email setMsg(String msg) throws EmailException, MessagingException

    {

    if (EmailUtils.isEmpty(msg))

    {

    throw new EmailException("Invalid message supplied");

    }

    setContent(msg, TEXT_PLAIN);

    return this;

    }

    }

    Email代码片段

    public void setContent(Object aObject, String aContentType)

    {

    this.content = aObject;

    if (EmailUtils.isEmpty(aContentType))

    {

    this.contentType = null;

    }

    else

    {

    // set the content type

    this.contentType = aContentType;

    // set the charset if the input was properly formed

    String strMarker = "; charset=";

    int charsetPos = aContentType.toLowerCase().indexOf(strMarker);

    if (charsetPos != -1)

    {

    // find the next space (after the marker)

    charsetPos += strMarker.length();

    int intCharsetEnd =

    aContentType.toLowerCase().indexOf(" ", charsetPos);

    if (intCharsetEnd != -1)

    {

    this.charset =

    aContentType.substring(charsetPos, intCharsetEnd);

    }

    else

    {

    this.charset = aContentType.substring(charsetPos);

    }

    }

    }

    }

    email.send();的send方法将调用

    public void buildMimeMessage() throws EmailException

    {

    try

    {

    this.getMailSession();

    this.message = new MimeMessage(this.session);

    if (EmailUtils.isNotEmpty(this.subject))

    {

    if (EmailUtils.isNotEmpty(this.charset))

    {

    this.message.setSubject(this.subject, this.charset);

    }

    else

    {

    this.message.setSubject(this.subject);

    }

    }

    // ========================================================

    // Start of replacement code

    if (this.content != null)

    {

    this.message.setContent(this.content, this.contentType);

    }

    // end of replacement code

    // ========================================================

    else if (this.emailBody != null)

    {

    this.message.setContent(this.emailBody);

    }

    else

    {

    this.message.setContent("", Email.TEXT_PLAIN);

    }

    if (this.fromAddress != null)

    {

    this.message.setFrom(this.fromAddress);

    }

    else

    {

    throw new EmailException("Sender address required");

    }

    if (this.toList.size() + this.ccList.size() + this.bccList.size() == 0)

    {

    throw new EmailException(

    "At least one receiver address required");

    }

    if (this.toList.size() > 0)

    {

    this.message.setRecipients(

    Message.RecipientType.TO,

    this.toInternetAddressArray(this.toList));

    }

    if (this.ccList.size() > 0)

    {

    this.message.setRecipients(

    Message.RecipientType.CC,

    this.toInternetAddressArray(this.ccList));

    }

    if (this.bccList.size() > 0)

    {

    this.message.setRecipients(

    Message.RecipientType.BCC,

    this.toInternetAddressArray(this.bccList));

    }

    if (this.replyList.size() > 0)

    {

    this.message.setReplyTo(

    this.toInternetAddressArray(this.replyList));

    }

    if (this.headers.size() > 0)

    {

    Iterator iterHeaderKeys = this.headers.keySet().iterator();

    while (iterHeaderKeys.hasNext())

    {

    String name = (String) iterHeaderKeys.next();

    String value = (String) headers.get(name);

    this.message.addHeader(name, value);

    }

    }

    if (this.message.getSentDate() == null)

    {

    this.message.setSentDate(getSentDate());

    }

    if (this.popBeforeSmtp)

    {

    Store store = session.getStore("pop3");

    store.connect(this.popHost, this.popUsername, this.popPassword);

    }

    }

    catch (MessagingException me)

    {

    throw new EmailException(me);

    }

    }

    由代码可以知道纯文本方式最终调用了Java Mail的

    message.setContent(this.content, this.contentType);

    content是内容

    contentType是类型,如text/plain,

    (我们可以试试直接用Java mail发邮件,设置文本内容不使用setText方法,也使用setContent("测试", "text/plain")方式,你可以看到内容也是乱码)

    关键就在于text/plain,我们改成text/plain;charset=gb2312,ok乱码解决了。在commons mail我们看SimpleEmail 类中setMsg方法调用的就是 setContent(msg, TEXT_PLAIN);我们只需要将Email类中的常量TEXT_PLAIN修改一下加入 charset=你的字符集 ,重新打包jar,这样就可以了

    7、toad的字符集的设置与oracle的安装

    oracle数据库服务器的安装一般是中文字符集,有时安装在不同的平台下,设置为ISO编码,toad是oracle开发的最好工具,不是我说的,可是中文环境下安装的toad,打开英文字符的oracle时,中文全是乱码。必须进行设置

    环境变量—〉系统变量

    NLS_lANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK

    NLS_lANG=AMERICAN_AMERICA.WE8ISO8859P1

    AMERICAN_AMERICA.WE8MSWIN1252

    或者

    打开注册表,点击HKEY_LOCAL_MATHINE

    再点击Software,再点击ORACLE

    在点击HOME(ORACLE所在目录)

    在注册表的右半面有NLS_LANG,

    双击它,将你想要的覆盖掉原来的就可以了

    最好记下旧的,以便可以改回来。

    connect sys/chang_on_install

    update props$

    set value$=’ZHS16CGB231280′

    where name=’NLS_CHARACTERSET’;

    commit;

    这样就OK了

    8、如何解決GWT(google web toolkit)中文的問題

    GWT 中文乱码解决方法

    1.把你要显示的中文“测试字符串”输入到一个文件,如:1.txt

    2.进入命令行,进入1.txt所在的目录,敲入以下命令:native2ascii.exe 1.txt 2.txt 回车。这样就生成了另外一个文件2.txt。

    3.2.txt的内容如下:/u6d4b/u8bd5/u5b57/u7b26/u4e32

    4.然后用上面的编码,在gwt中使用,就可以了.

    9、xmlHttp得到的网页怎么是乱码?

    (1)在服务器端使用WebRequest而不是xmlHttp

    (2) 将

    StreamReader sr = new StreamReader(stream);

    对于简体中文改成:

    StreamReader sr = new StreamReader(stream , Encoding.Default );

    对于utf-8改成:

    StreamReader sr = new StreamReader(stream , Encoding.UTF8 );

    当然,Encoding枚举还有很多其他的成员,对于不同的编码content-type可以有选择的应用

    (3)后来我发现无论是content-type是gb2312还是utf-8,用

    StreamReader sr = new StreamReader(stream , Encoding.Default );

    都可以返回正常的汉字,所以统一的改成Encoding.Default

    ——————————————————————————–

    最后,在服务器端从一个url获得网页的源代码的代码如下:

    ///

    /// post一个指定的url,获得网页的源代码(用WebRequest实现)

    ///

    ///

    ///

    /// 如果请求失败,返回null

    /// 如果请求成功,返回网页的源代码

    ///

    public static string GetContentFromUrl2( string url )

    {

    //变量定义

    string respstr;

    WebRequest myWebRequest=WebRequest.Create(url);

    //            myWebRequest.PreAuthenticate=true;

    //            NetworkCredential networkCredential=new NetworkCredential( username , password , domain );

    //            myWebRequest.Credentials=networkCredential;

    // Assign the response object of ‘WebRequest’ to a ‘WebResponse’ variable.

    WebResponse myWebResponse=myWebRequest.GetResponse();

    System.IO.Stream stream = myWebResponse.GetResponseStream();

    StreamReader sr = new StreamReader(stream , Encoding.Default );

    //以字符串形式读取数据流

    respstr = sr.ReadToEnd();

    sr.Close();

    return respstr;

    }

    展开全文
  • java中文乱码怎么转换

    2021-03-06 21:20:26
    java中文乱码的转换方法:首先用编辑器编写java源文件;然后使用【javac.exe】编译java文件,并使用JDK将编译好的且保存在内存中信息写入class文件中;最后运行编译类。java中文乱码的转换方法:使用编码转换java...
  • java中文乱码解决问题

    2015-04-15 11:26:41
    java中文乱码解决问题
  • java控制台中文汉字乱码

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

    千次阅读 2018-07-10 17:25:11
    原理:Java的内核和class文件是基于unicode的,这使Java程序具有良好的跨平台性,但也带来了一些中文乱码问题的麻烦。原因主要有两方面,Java和JSP文件本身编译时产生的乱码问题和Java程序于其他媒介交互产生的乱码...
  • java中文乱码终极解决方案

    万次阅读 2018-02-12 08:30:40
    转载自这篇文章简单描述:1、get方式乱码:tomcat 的server.xml 中加 URIEncoding="UTF-8"2、post方式乱码:使用过滤器即可解决3、log4j在linux下显示乱码解决方法:log4j配置文件中加一句话即可解决:log...
  • JAVA:Print汉字乱码问题

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

    万次阅读 热门讨论 2017-01-02 16:54:55
    小编总结了一下一些中文乱码的心得,总结一下积累。 【为什么】  在页面上输入信息,通过表单等打包提交成request请求发给服务器,jsp在运行时总是被编译成servlet,这期间也会有字符的编译,最终将数据插入数据库...
  • 方法1:修改notepad++的编码模式为:使用ASNI编码,重新保存文件后,在DOS下编译,即可解决乱码问题 方法2:无需修改notepad++的编码模式,在DOS下编译时,指定.java文件的编码模式 -encoding utf-8 参考 ...
  • VS code开发JAVA中文乱码问题

    千次阅读 2020-07-26 22:16:50
    使用VS code开发JAVA 在编写代码中包含中文时出现乱码。 原因分析:文件编码、编译的编码、显示的编码不同。 网上的思路有以下几种: 1、统一为GBK编码 2、统一为UTF-8编码,Win10系统也使用beta 的UTF-8显示...
  • java配置文件存储汉字乱码问题 在项目中,发现当在配置文件中配置中文的时候,读出来的配置是乱码,这里提供两种解决方案
  • java中文乱码解决之道(一)-----认识字符集

    万次阅读 多人点赞 2015-01-04 08:20:15
    阅读许多关于中文乱码的解决办法的博文后,发现对于该问题我们都(更加包括我自己)没有一个清晰明了的认识,于是LZ想通过这系列博文(估计只有几篇)来彻底分析、解决java中文乱码问题,如有错误之处望各位同仁指
  • 主要介绍了Java连接数据库oracle中文乱码解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 今天小编就为大家分享一篇完美解决Java获取文件路径出现乱码的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 解析Java中文乱码的处理方法

    万次阅读 2018-01-05 21:11:06
    【引自程序犹如人生的博客】为什么说乱码是中国程序员无法避免的话题呢?这个首先要从编码机制上说起,大家都是中文和英文的编码格式不是一样,解码也是不一样的!如果中国的程序员不会遇到乱码,那么只有使用汉语...
  • 主要介绍了Java中HttpServletResponse响应中文出现乱码问题的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
  • cmd命令运行java程序,中文乱码问题解决

    万次阅读 多人点赞 2018-04-21 21:13:09
    初学者使用记事本编写程序,使用命令行运行出现中文乱码问题解决方法如下:1.使用记事本打开------》另存为2.将utf-8改成ANSI3.结果如下:
  • 根据自己平时遇到的问题,以及根据资源,总结出了所有中文乱码问题,包括乱码问题的方式,分析乱码原因,以及给出几种乱码解决办法,基本上解决所有乱码问题,简单易懂,有截图。
  • java接口乱码

    2019-07-01 10:39:32
    通过接口上传中文信息出现乱码,可以这样解决修改一下tomcat配置文件: /conf/server.xml 原: <Connector port="8080" redirectPort="8443" connectionTimeout="20000" protocol="HTTP/1.1"/> 修改为:&...
  • Java:System.out.println() 输出中文乱码

    千次阅读 2021-01-14 12:21:35
    Java:System.out.println() 输出中文乱码2021-01-04 20:44:48出现乱码必然是编码的问题。一、解决办法这里出现的问题是在 IDEA 中的 servlet 中出现的,最终通过配置 Tomcat 的编码配置解决问题,方法如下:1)点击...
  • 踩了个坑,之前很少处理一次性的大量汉字请求,以为没有什么特别,直接使用了项目中封装好的通用方法,上线前几小时发现有个别乱码问题,因为只用了那个不是自己写的方法,所以很快定位到是字节流截断汉字导致乱码,...
  • CMD下Java中文显示乱码解决方法

    千次阅读 2017-09-14 23:05:39
    更改环境变量,操作如下、 更改后,重新使用javac编译,java运行,即可使用UTF-8编码格式,效果如下 已经能够正常显示中文
  • java——图片字体显示方块问题处理 /usr/java/jdk1.7.0_80/jre/lib/fonts/fallback msyhbd.ttf msyh.ttf wqy-microhei.ttf /usr/java/jdk1.7.0_80/lib/fonts/fallback msyhbd.ttf msyh.ttf wqy-microhei.ttf

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 24,253
精华内容 9,701
关键字:

java汉字乱码

java 订阅