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

    在基于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汉字乱码问题

    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程序具有良好的跨...
  • 我在eclipes环境下编写java代码遇到以下两种情况,请专家帮忙解释、解决一下,谢谢!第一种情况参数设置Windows->preferences->general->workspace->text file encoding->other->(改为)utf-8详见...
  • java中的汉字显示问号乱码怎么解决发布时间:2020-06-23 22:16:38来源:亿速云阅读:97作者:元一java中的汉字显示问号乱码怎么解决?针对这个问题,今天小编总结了这篇文章,希望能帮助更多想解决这个问题的朋友...
  • importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStream;importjava.io.InputStreamReader;importjava.net.HttpURLConnection;importjava.net.Malformed...import java.io.BufferedRead...
  • * @{#} 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; ...
  • Java汉字乱码问题

    2016-08-06 16:56:24
    为什么汉字在使用字节流处理数据是会出现乱码, 因为汉字在内存中是以两个字节的char类型的形式存储的,而InputStream和OotputStream 在读写数据时是一个字节一个字节处理的,故汉字不能一次就读入一个字,所以会...
  • 很多童鞋反应在吧项目导入到eclipse(myeclipse)时中文会有乱码,修改了编码格式后还是乱码,这里给大家介绍一下关于中文乱码时修改编码的注意事项:1、当在eclipse中打开一个文件后发现有中文乱码后,千万不能修改这...
  • java控制台中文汉字乱码

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

    千次阅读 2019-04-03 16:20:09
    关于Java字节流读取汉字乱码探究 问题概述 当我们尝试使用字节流对汉字进行写入读取操作时,可能出现乱码。其根本原因在于编码标准不同。汉字采用gbk,而idea使用UTF-8。在这样的前提下,开始讨论本文题。 使用...
  • Java应用中的汉字乱码问题分析
  • 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
  • Java读取网页HTML 汉字乱码 (已解决,bufferedReader中编码改成Java读取网页HTML 汉字乱码 (已解决,bufferedReader中编码改成跟网页的一致即可)#网页HTML的编码是gb2312#Java用utf-8 读取汉字乱码,读取网页HTML...
  • 中文乱码:1.jsp页面用utf-8编码页面1://url=encodeURI(url,"utf-8");页面2:url=decodeURI(window.location.href);2.tomcat设置utf-9编码修改server.xml文件中,相应的端口的Connector的属性:URIEncoding="UTF-8...
  • 相当郁闷,网上的方案都解决不了我的问题,最后还是无意间试出来的, ... 选择宋体(不要选择英文字体,如times new roman),否则java文件里面的汉字乱码 工具-》选项-》字体和颜色——》选择宋体 ...
  • 完美又简单解决Fedora16下使用Sun-JDK的汉字乱码(口口)问题这里的问题属于字体问题,只会在AWT/Swing的java程序中出现问题,原因是jre使用了不正确的fontconfig,表现为在zh_CN的窗口环境下,netbeans的菜单汉字显示...
  • java mysql 汉字存入时乱码从网络摘抄到的解决方法——解决方法二:连接mysql时(无论在从mysql读还是取数据的情况),指定使用的编码方式为utf-8,具体代码如下//装载mysql-jdbc驱动Class.forName(...
  • js向java后台传汉字乱码的解决方法

    千次阅读 2017-11-12 17:55:21
    在开发项目的过程中,遇到了js向Java后台传汉字时出现乱码的情况。 解决的大体思想是,在js中进行编码,然后在java后台中进行解码。 前台编码 var str = encodeURI("将要传的汉字"); 12 后台解码 str = ...
  • 原标题:JAVA WEB 乱码问题解析乱码原因在Java Web开发过程中,经常遇到乱码的问题,造成乱码的原因,概括起来就是对字符编码和解码的方式不匹配。既然乱码的原因是字符编码与解码的方式不匹配,那么为什么我们一定...

空空如也

空空如也

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

java汉字乱码

java 订阅