`
xieyj
  • 浏览: 102699 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

java转码及页面乱码原因分析

 
阅读更多

       近日,一个同事问我,在windows下面用tomcat跑,不乱码,在linux下面用websphere跑乱码,是怎么回事,笼统的回答是windows和linux默认编码不一致造成,感觉没说清楚,没能说清楚,就代表自己还没掌握。好好梳理一下。

       几个基本的知识点:

       1、String其实和char数组等价,保存为2个字节,为unicode编码。存放在string里面的都是2个字节表示一个字符。

       2、编码方式是针对子节流的,文档保存在磁盘,接收的网络数据都是以字节流方式存放。java读取文件,接收网络数据,应该先从new String(byte[],"编码方式")开始转换为String。

       3、String(byte[],“编码方式”)意思为,将字节流以指定的格式解析,转换为unicode,存放在String内存中。

       4、String的getBytes(“编码格式”)意思为将存放在String里面的字符流,按指定的编码格式转换为字节流。

       5、页面提交的编码行为在http://www.ibm.com/developerworks/cn/java/book_global_development/6/有详细的说明。

       服务器对提交参数解析行为,以tomcat5为例。

       源码CoyoteRequest.java ---此为HttpRequest接口实现,就是servlet中调用的getParameter()

    public String getParameter(String name) {

        if (!requestParametersParsed)

            parseRequestParameters();

        return coyoteRequest.getParameters().getParameter(name);

    }

    protected void parseRequestParameters() {

        .......

        String enc = coyoteRequest.getCharacterEncoding(); -----获取浏览器提交的编码格式,也就是页面提交的Charset-Type指定的编码格式。

        boolean useBodyEncodingForURI = connector.getUseBodyEncodingForURI(); ----tomcat

        if (enc != null) {

            parameters.setEncoding(enc);

            if (useBodyEncodingForURI) {

                parameters.setQueryStringEncoding(enc);

            }

        } else {

            parameters.setEncoding

                (org.apache.coyote.Constants.DEFAULT_CHARACTER_ENCODING);

            if (useBodyEncodingForURI) {

                parameters.setQueryStringEncoding

                    (org.apache.coyote.Constants.DEFAULT_CHARACTER_ENCODING);

            }

        }

        //上面说明页面提交有指定编码格式,则按指定的编码格式解析,否则按默认的ISO-8859-1解析。

        ......

        parameters.handleQueryParameters(); ---此方法调用processParameters

        .....

       }

      

      public void processParameters( byte bytes[], int start, int len, 

                                   String enc ) {

            ..............

             try {

                addParam( urlDecode(tmpName, enc), urlDecode(tmpValue, enc) );

            } catch (IOException e) {

                // Exception during character decoding: skip parameter

            }

           ..............

      } 

      private String urlDecode(ByteChunk bc, String enc)

        throws IOException {

        if( urlDec==null ) {

            urlDec=new UDecoder();   

        }

        urlDec.convert(bc);  ------urlDecode对每个byte进行还原。

        String result = null;

        if (enc != null) {

            bc.setEncoding(enc);

            result = bc.toString(); ------调用return new String( buff, start, end-start, enc );

        } else {

        。。。。

     }

     那我们看看不同服务器下面乱码的原因,做个小程序模拟一下不同服务器下面接收页面数据的流程

     String a = "汉字"; ----假设页面为UTF-8编码,可以用System.out.println(System.getProperty(file.encoding)查看一下

try {

              String b1 = URLEncoder.encode(a,"UTF-8"); //浏览器以UTF-8编码向服务器提交,进行一次编码

              //将byte转换为8859-1

              String d = URLDecoder.decode(b1,"ISO-8859-1"); //服务器先进行url解码,按默认的ISO-8859-1编码格式

               String out = new String(d.getBytes("ISO-8859-1"),"UTF-8"); //服务器getParamet()进行一次编码转换,linux上面服务器的编码格式为UTF-8,用locale 可以查看一下

                System.out.println("out----" + out);//这个等于在linux下面的输出

                String out_gbk = new String(d.getBytes("ISO-8859-1"),"GBK"); //windows下面的tomcat默认编码格式为GBK

                System.out.println("out_gbk----" + out_gbk);//此处表示tomcat输出为乱码

           } catch (UnsupportedEncodingException e) {

               // TODO Auto-generated catch block

               e.printStackTrace();

           }     

       由此可以知道服务器编码格式和页面提交的编码格式不同,造成linux和windows下面web服务器显示一个正常,一个乱码。

     

 

分享到:
评论

相关推荐

    java中文乱码之解决URL中文乱码问题的方法

    在Java开发中,遇到中文乱码问题是一种常见的挑战,特别是在处理URL时。URL中文乱码问题主要是由于URL编码和解码过程中的不一致导致的。下面将详细介绍如何解决这个问题,并探讨几种常用的方法。 首先,我们需要...

    java项目jsp中乱码问题解决

    在Java项目开发中,尤其是使用JSP技术时,经常遇到的中文乱码问题是一个常见的困扰。这涉及到编码和解码的过程,以及不同平台和环境之间的兼容性问题。Java的默认编码是Unicode,而中文文件和数据库通常使用GB2312或...

    java中文乱码

    Java 中文乱码解决方案 Java 中文乱码是指在 Java 应用程序中,中文字符在传输、存储和显示过程中出现的乱码问题。这种问题可能会出现在 Java 与数据库、JSP、文件流之间的数据交换过程中。本文将总结 Java 中文...

    jsp中页面间传汉字参数转码的方法.docx

    在JavaServer Pages (JSP) 开发中,页面间的参数传递是常见的操作,尤其是在处理包含汉字的参数时,由于编码问题可能会导致乱码。本文主要介绍如何在JSP中正确地进行汉字参数的转码与解码,确保数据在页面间传递时...

    java web 开发乱码汇总

    JSP/HTML页面乱码 确保JSP或HTML页面头部声明的字符集为UTF-8,例如在`<head>`标签中添加`; charset=UTF-8">`。此外,也可以通过`page`指令来设置JSP页面的字符编码,例如`<%@ page language="java" contentType=...

    润乾报表乱码问题

    页面显示乱码是最常见的问题,主要原因是数据库在取出数据时没有进行正确的转码,导致本应正确显示的汉字变成了乱码。而导出文件乱码则是因为服务器操作系统字体未安装完整,特别是在导出PDF文件时,由于缺少中文...

    关于Java Web中中文乱码问题的探讨.pdf

    本文针对Java Web开发中字符编码问题进行探讨,主要围绕字符编码的种类、设置方式以及不同页面类型的代码编写差异,分析中文乱码的成因,并提出解决方案,旨在为初学者提供解决中文乱码问题的思路。 首先,计算机...

    页面间跳转乱码

    接下来,我们将围绕“页面间跳转乱码”的问题,从多个角度进行深入分析,并给出相应的解决方案。 ### 一、问题背景 在Web应用中,页面之间的跳转通常伴随着参数的传递,这些参数可能包括用户的输入数据,如姓名、...

    ascii编码转码工具

    "ASCII编码转码工具"是针对处理ASCII与非ASCII编码之间转换的软件,它可以有效地解决字符乱码问题。这类工具通常提供两种操作方式:直接输入转码和文件方式转码。直接输入转码允许用户手动输入ASCII编码的字符串,并...

    jsp中文乱码问题jsp中文乱码问题详解

    jsp中文乱码问题详解 在jsp中文乱码问题中,乱码的出现是由于编码格式不一致所导致的。在jsp文件中,存在三个地方的编码格式:jsp文件的存储格式、解码格式和控制浏览器的解码方式。如果这三个地方的编码格式不一致...

    中文乱码解决

    本文将深入探讨Java和JSP中的中文乱码问题及其解决方案。 首先,我们要明白Java和JSP的内核是基于Unicode的,这确保了程序的跨平台性,但也意味着在处理非Unicode编码(如GBK或GB2312)时可能出现乱码。乱码问题...

    je22中乱码问题

    本文将深入探讨Java环境中出现乱码的原因及其解决方案,帮助读者彻底理解并解决这一常见问题。 #### 二、乱码产生的原因 乱码的根本原因是编码不一致导致的。当一个字符从一种编码格式被错误地解释为另一种编码...

    JSP乱码 N种解决方案

    在开发Java Web应用程序时,JSP(JavaServer Pages)页面经常遇到字符编码问题,导致页面显示乱码。本文将深入探讨“JSP乱码”的多种解决方案,并提供实用的解决策略。 1. **理解字符编码的基本概念** - 字符编码...

    JSP中解决中文乱码的万能方法

    - **手动转码**:在客户端或者服务器端对请求参数进行转码处理。 服务器端示例: ```java String name = request.getParameter("name"); String name1 = new String(name.getBytes("ISO-8859-1"), "UTF-8");...

    html 中文乱码 HTML超链接中文乱码问题分析及解决方法

    本文主要讨论的是第二种情况,即HTML超链接中文乱码问题的分析与解决。 在Web应用程序中,当需要在超链接(`<a>`标签)中包含中文参数作为GET请求的一部分时,必须确保这些中文字符被正确编码。这是因为URL本身只能...

    java函数

    `Html.java`可能包含了生成HTML分页链接的方法,而`Str.java`可能包含了处理字符串(如中文字符)的相关函数,如转码、检查乱码等。 总的来说,理解和熟练运用这些Java函数对于进行J2EE开发至关重要,它们帮助我们...

    Struts2国际化转码小工具

    Struts2是一个非常流行的Java Web框架,用于构建可维护、高效且易于扩展的企业级应用程序。在Struts2中,国际化(i18n)是一项重要功能,它允许开发者为不同地区的用户提供本地化的应用体验。`native2ascii`工具是...

    程序乱码问题的处理

    charset=iso8859-1" %>` 设置了页面内容的类型及编码方式。这里的`iso8859-1`是一种常用的西欧字符集,如果页面中有非西欧字符,就会出现乱码。 ### 二、编码不一致导致的乱码 #### 1. 页面编码与服务器接收编码不...

    JSP与MySQL交互的中文乱码解决方案

    - **写入数据**:在写入数据时,若直接使用JSP页面的中文字符串,可能会因为编码转换不当导致乱码。此时,需要在写入前对字符串进行转码,例如将GBK编码的字符串`s1`转换为ISO-8859-1编码:`String s2 = new String...

Global site tag (gtag.js) - Google Analytics