• 当我们在linux上发布J2ee项目时,经常会碰到让人头疼的乱码问题;根据自己的经历总结有三种常见的问题和原因:首先,一种情况是,jsp页面你已经设置了编码集为GBK,但个别地方中文(通过传参数过来的得到)为乱码、...
    当我们在linux上发布J2ee项目时,经常会碰到让人头疼的乱码问题;根据自己的经历总结有三种常见的问题和原因:
    首先,一种情况是,jsp页面你已经设置了编码集为GBK,但个别地方中文(通过传参数过来的得到)为乱码、这个的解决办法就是对于request通过get得到的内容进行编码转换。但这个方法比较累。常用的办法就是写一个过滤器类。
    import java.io.IOException; import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse; /**
    * @author zhangpeng *
    */
    public class EncodeFilter implements Filter { private String encoding = null;

    private FilterConfig config = null;

    private boolean isUsed; /*
       * @see javax.servlet.Filter#init(javax.servlet.FilterConfig)
       */
    public void init(FilterConfig arg0) throws ServletException {
       this.config = arg0;
      
       this.encoding = arg0.getInitParameter("encoding");
      
       String strUsed = arg0.getInitParameter("isUsed");
       if (strUsed != null && strUsed.equalsIgnoreCase("true")) {
        this.isUsed = true;
       } else {
        this.isUsed = false;
       }
    } /*
       *
       * @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest,
       *       javax.servlet.ServletResponse, javax.servlet.FilterChain)
       */
    public void doFilter(ServletRequest arg0, ServletResponse arg1,
        FilterChain arg2) throws IOException, ServletException {
      
       if ((this.isUsed || arg0.getCharacterEncoding() == null)
         && this.encoding != null) {
        arg0.setCharacterEncoding(this.encoding);   
       }    arg2.doFilter(arg0, arg1); } /*
       *
       * @see javax.servlet.Filter#destroy()
       */
    public void destroy() {
       this.config = null;
       this.encoding = null;
    } }
    再配置web.xml文件;    
     <filter>
           <filter-name>Set Character Encoding</filter-name>
           <filter-class>com.et.filter.EncodeFilter</filter-class>
           <init-param>
              <param-name>encoding</param-name>
              <param-value>gbk</param-value>
           </init-param>
           <init-param>
              <param-name>isUsed</param-name>
              <param-value>true</param-value>
           </init-param>
        </filter> 这样所有对于因为request传参和得到参数而出现乱码的问题都会得到解决
    其次:上边的问题排除后,还有乱码问题(常出现在页面信息等),这就需要检查你的服务器配置的编码。/conf/server.xml中加上或者修改为   
      <Connector port="80"
                    maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
                    enableLookups="false" redirectPort="8443" acceptCount="100"
                    debug="0" connectionTimeout="20000"
                    disableUploadTimeout="true" URIEncoding="GBK"   />加上粗体的部分;
    再者。以上的你都做到了但是仍有乱码(多见静态页面,jsp中包含进来静态页面中出现乱码,从页面得到的内容在插到数据库前已经乱码),这时你可以写上一个测试代码在类中System.out.println("========="+System.getProperty("file.encoding"));或者页面上<%=System.getProperty("file.encoding")%>都可以:查看一下系统的编码集是不是GB18030如果不是,打开/etc/sysconfig/i18n文件改为 LANG="zh_CN.GB18030"
    LANGUAGE="zh_CN.GB18030:zh_CN.GB2312:zh_CN"
    SUPPORTED="zh_CN.GB18030:zh_CN:zh"
    SYSFONT="lat0-sun16"
    SYSFONTACM="8859-15"
    最后:上边的乱码情况,都是在你没插入数据库前中文就已经乱码的情况和解决办法。如果上边所有你都确信做到了且经过测试插入数据库前已经没有乱码问题了。但是插入数据库后显示出来的又是乱码,那就需要改你的数据库中的配置文件中的编码集了
     
    展开全文
  • 所以导致在LINUX下运行的网站,获取数据库的中文全是乱码,具体解决: 1.ROOT用户下 vi /etc/sysconfig/i18n 将原来的: LANG="zh_CN.UTF-8" SUPPORTED="zh_CN.UTF-8:zh_CN:zh" ...

    我在JSP中用的是gb2312编码
    而LINUX系统默认的是UTF-8
    所以导致在LINUX下运行的网站,获取数据库中的中文全是乱码,具体解决:
    1.在ROOT用户下
    vi /etc/sysconfig/i18n
    将原来的:
    LANG="zh_CN.UTF-8"
    SUPPORTED="zh_CN.UTF-8:zh_CN:zh"
    SYSFONT="latarcyrheb-sun16"
    改为
    # vi /etc/sysconfig/i18n 修改该文件的内容 # 表示被注释了

    #LANG="zh_CN.UTF-8"
    #SUPPORTED="zh_CN.UTF-8:zh_CN:zh"
    #SYSFONT="latarcyrheb-sun16"
    LANG="zh_CN.GB2312"
    LANGUAGE="zh_CN.GB2312:zh_CN"
    SUPPORTED="zh_CN.GB2312:zh_CN:zh_CN.UTF-8"
    SYSFONT="lat0-sun16"
    SYSFONTACM="8859-15"
    2.处理包含汉字字符的字符串时要指定gb2312或者GB2312编码
    如: String caption = new String(caption.getBytes("iso-8859-1"), "gb2312");//传递的参数,指定编码

    String templateContent = "";
    FileInputStream fileinputstream = new FileInputStream(filePath);
    // 读取模板文件
    int lenght = fileinputstream.available();
    byte bytes[] = new byte[lenght];
    fileinputstream.read(bytes);
    fileinputstream.close();
    templateContent = new String(bytes,"GB2312"); //指定编码

    展开全文
  • a页面的js  function dd(){  var form = document.getElementById("ff");  form.action='b.jsp?name='+encodeURI(encodeURI('咋还能干'));  form.submit();  } b页面的java代码 String name =...

    在a页面的js中

     function dd(){
      var form = document.getElementById("ff");
       form.action='b.jsp?name='+encodeURI(encodeURI('咋还能干'));
       form.submit();
     }

    b页面的java代码中

    String name =java.net.URLDecoder.decode(request.getParameter("name"),"utf-8");

     

     

    展开全文
  • 摘 要:一个项目的开发,我用linux内核源代码和busybox源代码自己编译打造的操作系统mylinux 1.0 ,服务器是我用java语言自己编写的一个多线程的小服务器MyWebServer 2.0,其中的JSP编译器和“javax....

    转载于:http://blog.chinaunix.net/u3/114157/showart_2245018.html

     

    摘  要:在一个项目的开发中,我用linux内核源代码和busybox源代码自己编译打造的操作系统mylinux 1.0 ,服务器是我用java语言自己编写的一个多线程的小服务器MyWebServer 2.0,其中的JSP编译器和“javax.servlet.*” API是我自己编写。本文结合我在该项目中对中文显示乱码处理的经验,论述了java语言在linux操作系统下中文乱码产生的原因和解决方法。

    关键词:字符集;本地化;URL encode;URL decoder

    中图分类号:TP312JA      文献标识码:A

    Study on the Chinese Error Coding in the Java Programs on Linux

    JIA Jin-ying1, JIA Jin-ying2

            (1.Pingdingshan City Branch Company of China Unicom ,Henan Pingdingshan 467300, 2.Manages Departyment of Hebei University 071002)

    Key words:character set;locale;URL encode;URL decoder.
    用java语言在微软的windows下,无论是基于awt(swing)的图形界面程序编写,还是基于B/S结构的JSP(Servlet)的系统开发,一般都不会遇到中文显示乱码,只有在URL传递中文参数时会出现乱码,但做过JSP项目的程序员都知道通过字符串的简单的重新编码就能得到原来的汉字,至于其内部原理大概所知到的人就不多了。然而在linux下做java项目的开发中文显示问题就复杂的多了,特别是在微软的windows下开发的系统直接拿到linux下运行一般就会出现中文乱码现像。一般开发人员都会通过将所有的程序源码文件别存为新的字符编码文件,或者通过在IDE中设置文档编码,然后在linux下重新编译整个项目,就能解决问题,然而为什么要这么做呢?下面就从字符编码说起来解释问题的本质。

    1         字符集

    字符集(CHARACTER SET),或称字集,是指字符的集合;字符集种类较多,每个字符集包含的字符个数不同,常见的字符集名称:ASCII字符集、GB2312字符集、GB18030字符集、UNICODE字符集等。

    1.1ASCII字符集

    上个世纪60年代,美国有关的标准化组织就出台了ASCII(AMERICAN STANDARD CODE FOR INFORMATION INTERCHANGE:美国信息交换标准码)编码,制定了一套字符编码,只能表示256个符号,主要用于显示现代英语和其他西欧语言。它是现今最通用的单字节编码系统,并等同于国际标准ISO 10646。

    1.2GB系列字符集(GB2312、GB13000、GBK、GB18030)

    GB2312由原中国国家标准总局发布,共收录6763个简体汉字、682个符号,由于GB2312定义的字符集太小,容纳的汉字太少,在UNICODE出台之后,我国立刻制定了完全兼容的GB13000标准,微软以技术上难以实现为理由,自己搞了一套扩展字符集,也就是GBK,在GB2312基础上定义了包括繁体字在内的更多汉字,并在WINDOWS简体中文版中加以实施。到了二十世纪末,GBK字符集也不够用了,WINDOWS操作系统将内核改为支持UNICODE字符集。UNICODE与GB系列字符集不兼容。于是我国政府于2000年3月17日发布的新的汉字编码国家标准GB18030,作为我国所有非手持/嵌入式计算机系统的强制实施标准,GB18030收录了27484个汉字,不但与UNICODE3.0版本兼容,还与以前的GB字符编码标准兼容。

    2  字符编码与字库

    字符集只是文字的集合,不一定适合网络传送、处理。计算机要准确的处理各种字符集文字,有时须经编码(ENCODING)后才能应用。所谓字符编码是规定每个“字符”分别用一个字节还是多个字节存储,用哪些字节来存储,这个规定就叫做“编码”。各个国家和地区在制定编码标准的时候,“字符集”和“编码”一般都是同时制定的。因此,平常我们所说的“字符集”,比如GB2312、GBK等,除了有“字符的集合”这层含义外,同时也包含了“编码”的含义。对UNICODE字符集的编码称为UTF。目前通用的编码标准有UTF-16小尾序(LITTLE ENDIAN)、UTF-16大尾序(BIG ENDIAN)和UTF-8变长编码。

    字库就是字型库(FONT LIBRARY),其实计算机上显示的每个字符(不管它是哪种语言的),都是一个小的图案。字库就是把这些小的图案以图片的某种形式保存起来,需要显示的时候还原出来就可以了。在WINDOWS操作系统里的字库存放在系统盘windows/fonts文件夹下,在linux操作系统中字库存放在这/usr/share/fonts/文件夹下。

    3  Java语言中产生乱码的原因及解决方法

    3.1基于awt(swing)的图形界面程序中文显示乱码

    基于awt(swing)的图形界面程序中,一般会出现菜单中的中文显示乱码,其原因一般是JVM找不到用来显示中文的字库,JVM在原始的安装下是没有中文字库的,而linux的发行版本又各不相同,其字库存放的路径和名字又各不相同,所以JVM一般是找不到linux操作系统内带的字库,解决方法是让JVM能找到linux操作系统内带的字库,如在Redflag 6.0下可以通过下面命令解决:

    mkdir /usr/java/jdk1.6.0/jre/lib/fonts/fallback

    ln -s /usr/share/fonts/chinese/TrueType/*.ttf /usr/java/jdk1.6.0/jre/lib/fonts/fallback

    一般不需要修改JRE/lib/目录下的字体配置文件(fontconfig.OS.Version.properties)。

    3.2 基于B/S结构的JSP(Servlet)的系统用户端浏览器中文显示乱码

    3.2.1页面中的中文显示乱码

    对于像HTML的静态文件,其文件的字符集只要和文件中<meta http-equiv="Content-Type" content="text/html; charset=…… ">处所设置的一样即可。

    对于像JSP和Servlet动态文件由于需要经过编译,在运行是由JVM解释class文件而产生用户端浏览器所需的HTML文件,如果产生中文乱码,则一般是由编译和运行过程中产生的。如果用商用的发行版Linux和服务器,一般只要将JSP或Servlet文件保存为UTF-8字符集,将<meta http-equiv = "Content-Type" content="text/html; charset=…… ">中设置为UTF-8即可。如果还出现乱码则可以通过以下方法解决:

    ①如果服务器是自主研发的,可以通过修改源代码,指定JVM读文件、写文件以及生成用户端浏览器所需的HTML文件时,字符串与二进制序列流转换时的编码方式,从而从根本上解决问题,增强服务器的适应性,在MyWebServer 2.0中,我就采用了这种方法,代码如下:

    new BufferedReader(new InputStreamReader(new FileInputStream(jspfile),"GBK"));

    new PrintWriter(serfile,"GBK");

    new PrintWriter(new OutputStreamWriter(os,"GBK"));

    ②当然也可以在服务器的入口文件(即含有main子函数的文件)中修改JVM的“locale”设置,代码如下:

    Locale.setDefault(new Locale(“zh”,”CN”));

    ③当采用商用服务器时,可以修改启动服务器的shell文件,在启动服务器前设置环境变量“export LC_ALL=zh_CN.UTF-8”,从而改变本控制台下默认的“locale”值。

    ④当然也可以修改操作系统的“locale”设置,但由于修改操作系统的“locale”设置将会影响到其他应用程序,所以一般采用该方法。

    采用上述方法的主要原因是,当JVM在首次起动时,将会把操作系统的“locale”设置为JVM的默认“locale”,在操作系统没有设置“locale”值时(如mylinux 1.0),JVM将会把JVM的缺省的“locale”设置为JVM的默认“locale”,当然也可以在运行应用程序时修改JVM的默认“locale”设置,在JVM进行字符串与二进制序列流相互转换时,如果指定了编码方式,将以指定的编码方式转换,否则根据JVM的默认“locale”进行转换。

    3.2.2 get方法从URL获取的参数中中文显示乱码

         对于get方法来说,都是把数据串联在请求的url后面作为参数,url拼接完成后,浏览器会对url进行URL encode,然后发送给服务器,URL encode的过程就是把部分的url做为字符,按照某种编码方式(如:utf-8,gbk等)编码成二进制的字节码,然后每个字节用一个包含3个字符的字符串 "%xy" 表示,其中xy为该字节的两位十六进制表示形式。了解了URL encode的过程,我们能看到2个很重要的问题,第一:需要URL encode的字符一般都是非ASCII的字符,所以都是英文字母的url不会出现服务器得到乱码问题,出现乱码都是url里面带了中文或特殊字符造成的;第二:URL encode到底按照那种编码方式对字符编码?不同的浏览器有不同的做法,中文版的浏览器一般会默认的使用GBK,通过设置浏览器也可以使用UTF-8,完成了URL encode的url就成了ASCII范围内的字符了,然后以iso-8859-1的编码方式转换成二进制随着请求头一起发送出去。

    服务器端获取到数据,第一步是先把数据用iso-8859-1进行解码,对于get方法来说,tomcat获取数据的是ASCII范围内的请求头字符,其中的请求url里面带有参数数据,如果参数中有中文等特殊字符,那么目前还是URL encode后的%XY状态,先停下,我们先说下开发人员一般获取数据的过程。通常大家都是request.getParameter("name")获取参数数据,我们在request对象或得的数据都是经过解码过的,而解码过程中程序里是无法指定,服务器tomcat默认缺省用的是iso-8859-1,这样我们就能找到为什么get请求带中文参数为什么在服务器端得到乱码了,原因是在客户端一般都是用UTF-8或GBK对数据URL encode,这里用iso-8859-1方式URL decoder显然不行,所以一般可以采用以下代码解决:

    String Sname = new String(request.getParameter("name").getBytes("iso-8859-1"),"GBK");

    //其中的“GBK”为用户端用浏览器URL编码方式。

    也可以修改服务器的配置文件,让服务器在获取数据后用指定的方式进行URL decoder。

    如果服务器是自主研发的,可以通过修改服务器的源代码,指定URL的解编码方式,从而解决问题。如在myWebServer2.0中,我采用了在程序中直接指定以"iso-8859-1"字符集组装二进制序列流,用“GBK“进行URL的解编码,从而可以使在众多的微软中文IE浏览器下JSP可以直接接收到正确的中文参数。相关代码如下:

    InputStreamReader myISR=new InputStreamReader(in,"iso-8859-1");

    temp=URLDecoder.decode(temp,"GBK");

    然而在做开发时,不可能要求用户端用浏览器都用同样的方式进行URL编码,为了服务器能正确接收所有的用户的URL中的中文参数,通常可以通过用JavaScript角本语言先将参数进行编码,编码后参数中的中文将会转换为”ACSII”码,然后再拼装到URL的后面提交,这时在服务器端就可以用统一的方式从request中取到URL,然后再取出URL的参数进行解码。

    3.2.3  post方法提交的中文参数出现乱码

    在post方法里所要传送的数据也要URL编码,在form所在的html文件里如果有段<meta http-equiv="Content-Type" content="text/html; charset=gb2312 "/>,那么post就会用此处指定的编码方式编码。一般大家都认为这段代码是为了让浏览器知道用什么字符集来对网页解释,其实它还有个作用就是指定form表单的post方法提交数据的URL encode编码方式。对于get方法来数,浏览器对数据的URL encode的编码方式是有浏览器设置来决定,而post方法,开发人员可以指定。如果用tomcat默认缺省设置,也没做过滤器等编码设置,那么他也是用“iso-8859-1”解码的,也可以通过在JSP中设置request.setCharacterEncoding("…")这时服务器会以JSP中指定的字符集解码。

    4  结论

    Java语言在linux下中文显示产生的乱码,主要与JVM的字库、操作系统的locale设置、JVM的默认locale设置、应用程序中的locale设置以及应用程序中直接指定的二进制序列流与字符串转化的字符集有关。是由于二进制序列流和字符串相互转化过程中所采用的字符编码方式不同或者JVM找不到所需要的字库所致,可以采取不同的方法去解决,具体采用哪种方法处理还要结合具体的应用环境。

    展开全文
  • 1.JSP页面显示时乱码——输出时乱码, 解决方案:为其指定中文字符集,前加&lt;%@pagecontentType=”text/html”:chartset=”gb2312”%&gt; 2.JSP页面传递中文参数时乱码——get表单提交 解决方案:...

    *WEB容器默认的字符串处理编码是ISO-8859-1
    1.JSP页面显示时乱码——输出时乱码,
    解决方案:为其指定中文字符集,前加<%@pagecontentType=”text/html”:chartset=”gb2312”%>

    2.JSP页面传递中文参数时乱码——get表单提交
    解决方案:String email=new String(request.getparmeter(“哈哈”).getByte(“ISO-8859-1”),”gb2312”);%>

    3.servlet处理中文参数时乱码
    request.setCharacterEcodeing(“gb2312”);在doPost中加入response.setCotentType(“”text/html;chartset=”gb2312”);

    4.post表单乱码
    提交页面给对应的JSP页面或者是servlet后,接收方出现表单数据中文值有乱码,解决方案:在接受post提交的参数之前,使用request.setCharacterEncodeing(“UTF-8”),设定只对post提交有用,get没有用
    原因分析:
    1.在文本框输入中文提交后,返回的是乱码,由于request.getparamter(“”),得到的参数编码的方式是有ISO-8859-1
    (1).故在之前加上<%request.setCharaterEcnoding(“GBK”)%>,那么request就用这个编码接受
    (2).在配置文件Server.xml中,扎到含Port=“8080”的connector区块,在其后面加上一句URIEncodeing=”GBK”,重启Tomcate,对所有的网站都有用

    2.数据库中表中字段有中文信息,JSP运行死显示??原因是:数据库JDBC驱动程序,默认的在java和数据库之间传递,数据库都是以ISO-8859-1为默认的编码格式,几十数据库原本是用中文编码(如gbk),jdk也会自动主张的将其转为ISO-8859
    解决方案:在连接数据库时,在URL中后面加上?useUnicode=true@characterEncoding=”GBK”,例如:mysql://localhost:3306/sqltest?useUnicode=true@characterEncoding=”GBK”

    3.通过URL传递参数乱码
    ,这个转换字符串的拜年吗或者设置JSP页面显示编码都不行,只能改服务器servel.xml编码

    7.浏览器版本低导致的乱码,编码:URLEncoding.encode(name,”utf-8”),传递给服务器”>,解码:URLDecoder.decode(name,”utf-8”)

    8.返回浏览器乱码:由于response.getWriter()方法,返回的printerwriter对象默认使用的是ISO-8859-1,字符集编码,故用setchraterEncodeing,setconentType的方法

    *总结:
    1.对于浏览器接受服务器和发送服务器编码都是一样的,默认是JSP页面的response.setContentType方法,
    2.而服务器发送的数据,则是按照response.setChractrEncoding——contentType——pageEncoding,优先顺序,
    3.数据接收有三种方式:1.URL提交。2.get提交。3.post提交。
    乱码问题的原因,程序的编码没有和编程人员的编码进行统一(就像你和一个不懂中文的人(计算机)进行交流,他当然不懂),故要不然手动转码,或者声明编码让程序转

    展开全文
  • tomcat 下jsp乱码的原因分析。从jsp文件的编码、浏览器页面的编码、以及tomcat本身对数据处理方式等各个方面一一阐述了乱码产生的原因以及解决乱码的基本的方法
  • https://www.itbulu.com/linux-java-fonts.html老蒋因为一个项目工作是朋友帮助用JAVA写的,因为之前都没有接触过这类的环境,而且现在JSP主机都比较难找(好久没有用过虚拟主机),于是前几天就在Linux VPS搭建...
  • 我用的Tomcat,现在遇到乱码问题:  通用的解决方案如下:  Java代码  "8080" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" />  但是这里死活不起作用。  ...
  • jsp中文显示乱码解决方案一、JSP页面显示乱码二、表单提交中文时出现乱码三、数据库连接大家在JSP的开发过程,经常出现中文乱码的问题,可能一至困扰着您,我现在把我在JSP开发遇到的中文乱码的问题及解决...
  • 相应的步骤如下: 1. js调用action. 参数有中文. [code="js"] action:'abcd.jsp?title='+encodeURI("中文");...在linux中汉字已经乱码了..请问大大这是什么原因.该如何休整. 偶对linux不是很熟的说~ :oops:
  • linux mysql 解决中文乱码问题
  • 一次解决乱码问题, 发现jsp在windows下用js原生的方法进行编码没有问题,但是到了linux下就有问题, escape,encodeURI,encodeURIComponent等都解决不了问题 但是我想了下既然原生的方法不行,我用el标签的方式...
  • jsp:include page="footer.jsp" ...问题描述:引入footer.jsp 引入的jsp中文乱码。 解决方案:当前应用系统的web.xml里加入jsp-config代码:      Special property group for JSP Co
  • java jsp页面传过来到汉字window下不乱码部署到linux系统下就会乱码
  • 用vim打开要转码的文件,vim没有乱码,必须要无乱码,如果还有乱码说明文件解码方案错误嘛。再更改文档编码格式已经没有意义了。 vim命令行模式下用 :set fenc?查看当前文档的编码方式,vim就是用这个编
  • jsp中文显示乱码解决方案(文章来源:https://blog.csdn.net/weixin_41648325/article/details/79465966)一、JSP页面显示乱码二、表单提交...我现在把我在JSP开发遇到的中文乱码的问题及解决办法写出来供大家参考...
  • 启动web服务器之前,应该命令行先键入以下命令: export LANG=zh_CN.GBK 如,tomcat+linux,如果是远程控制linux可下载SSH Secure Shell Client 客户端: export LANG=zh_CN.GBK startup.sh  这样可解决乱码问题
  • 1,安装J2SDK 1.1 使用Debian源里的安装包 以root 身份运行apt-get install sun-j2sdk1.4,这样将安装sun的j2...否则搜索是否有java和javac两个文件,我的/usr/lib/j2sdk1.4-sun/bin下,如果有就创建链接到/usr/bi...
  • ,而后台代码使用String的new String(string.getBytes("ISO-8859-1"),"UTF-8"),所以本地解决了; 部署到服务器后,就出现了乱码,服务器端也没有URIEncoding="UTF-8",但是乱码...
1 2 3 4 5 ... 20
收藏数 7,680
精华内容 3,072