`
hejiajunsh
  • 浏览: 410747 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

JSP乱码问题剖析与终极解决方案

阅读更多

服务器返回乱码页面,请求的数据发送到服务器后取出来是乱码,以上两个问题是web开发人员经常遇到的问题,解决这类问题需要理解乱码问题的根源所在。

1. 字符编码
字符是以二进制编码的形式保存在存储器中的,如:“我”这个字,可以用gbk的方式保存(用字节表示是[-50, -46]),也可以用utf-8的方式保存(用字节表示是[-26, -120, -111])。程序在读取数据块时需要一个字节一个字节的读取,然后将字节转换为字符,显然如果程序不知道字节是表示的什么编码的字符,读出来就会出问题,这就如同你说了一句话,我如果事先不知道你说的将是什么语言,就没法去翻译了,如果你说的英语,我以为是日语,然后按日语的方式来理解到我的主观意识,显然结果就是不知你在说什么了,就成了我们程序中的乱码。所以对于前面我所表示的字节数组byte[] data = {-26, -120, -111},我们必须这样做才能得到正确的字符: String s = new String(data, "utf-8"),(注:这里用了字符串,因为字符串就是由一个个字符组成的),如果我们不指定参数里面的"utf-8",那么系统就会用操作系统默认的编码了,这可能是gbk或是什么任何编码。

2. jsp服务器返回乱码页面
  2.1 pageEncoding
  在jsp页面的page指令中我们指定了pageEncoding属性,这个属性就是告诉jsp容器如何读取这个jsp页面,所以这个属性必须与jsp页面保存的编码保持一致。也就是说,如果你页面的编码保存为gbk, 而pageEncoding设置成了utf-8,则jsp容器在读这个jsp页面的时候就会出错(如果存在非英文字符的话)。jsp容器读jsp的目的是将其翻译成java代码,所以如果读错了jsp页面,翻译出来的java代码也就会出错,如果这种错误影响了java文件的语法,就会在访问时出现无法编译jsp的语法错误,如果没有影响到语法,就会出现最终显示的html页面上有乱码的错误。所以如果遇到显示乱码,则检查pageEncoding是否正确。
  2.2 contentType
  page指令中的contentType属性用于指定返回给浏览器的数据的文档类型,服务器通过http头信息返回给浏览器这个信息,所以在浏览器 html代码中用户是看不到的。同时contentType属性还可以指定页面的编码,即服务器即以什么编码发送页面数据。比如说中文数据,可以用gbk 或utf-8的方式来发送,这个编码跟jsp页面的编码没有关系,只要设定的编码支持页面中的字符就行了。相同于有了一个字符串s="中国人",然后用 s.getBytes("gbk")的方式来发送s。所以由于contentType错误出现乱码的概念不高,但也要注意一下,比如说如果设置成了"iso8859-1",则浏览器就会显示乱码了。contentType还有一个用,就是浏览器将会依据这个编码来显示页面,在IE下点右键,然后选择“编码”,你就可以注意到页面是以什么编码显示的了。
  2.3 如果是servlet返回的结果
  上面说的是jsp,如果servlet的话就要注意设置response.setCharacterEncoding(""),如果没有设置,服务器会默认为是iso8859-1,设置后得到的writer(即response.getWriter())对象,就会依据这个编码来向客户端写数据,writer对象的构造与以下方式类似:PrintWriter pw = new PrinterWriter(new OutputStreamWriter(socket.getOutputStream(), "编码")),这里提到了通过socket得到输出流,不明白的话可以参考我的另一篇文章。pw.write("你好"),实际上就是先通过byte[] data = "你好".getBytes("编码"),然后将data写给客户端。
)

3. 服务器得到客户端传过来的数据为乱码
  3.1 通用解决方案
  String param = request.getParameter("paramName"),如果浏览器传过来的为中文,则取出来的数据将是乱码。为什么呢?因为客户端只能将数据的编码传给服务器,如[-26, -120, -111],但服务器并不知道这是什么字符集的编码,于是假定为iso8859-1, 用这种方式构造了字符串s = new String(data, "iso8859-1"),显然这样肯定是乱码。解决方案很简单,我们得到值param后,用byte data[] = param.getBytes("iso8859-1"),这样data就是客户端传过来的真实编码,然后我们再重新创建字符串:param = new String(data, "正确的编码");
  3.2 POST请求
  如于post请求处理起来更简单,get请求与post请求向服务器发送数据的方式不一样,get请求的参数是通过HTTP头信息中的第一行数据发送的,是URI的一部分,而post请求则是在发送完HTTP头信息后作为单独的数据块发送的。因此对于get请求的参数,我们在使用request之前服务器已经读出来了,已经是乱码了,只能用前面的方案,但对于post请求的数据,我们在调用getParameter或getReader之前,服务器并没有去处理,所以我们可以在getParameter之前先告诉服务器正确的编码,通过request.setCharacterEncoding("正确的编码"),然后再读取参数。

4 AJax
  对于ajax请求注意要用utf-8编码,request和response都需要使用utf-8

分享到:
评论

相关推荐

    乱码问题终极解决方案

    本篇文章将针对"乱码问题终极解决方案"这个主题,深入探讨在Java、JSP和Ajax中如何有效地预防和解决乱码问题。 首先,我们要理解乱码产生的原因。乱码通常是因为字符编码不一致导致的,比如文件编码、程序内部编码...

    JSP乱码问题相关的一些集锦

    本文将针对JSP乱码问题进行深入探讨,并提供一系列有效的解决方案。 #### 一、理解乱码产生的原因 在探讨解决方案之前,我们先来了解一下为什么会出现乱码。通常情况下,乱码的产生是由于编码格式不一致导致的。...

    eclipse下properties文件中文乱码的解决方案

    ### Eclipse下Properties文件中文乱码解决方案详析 在IT开发领域,尤其是使用Eclipse作为集成开发环境(IDE)的开发者,经常会遇到一个令人头疼的问题——Properties文件中的中文字符出现乱码。这一现象不仅影响...

    JSP乱码解决

    ### JSP乱码解决方案:Apache配置详解 在Web开发中,尤其是使用Java Server Pages (JSP)进行网页设计时,中文乱码问题时常困扰开发者。本文将深入探讨如何通过配置Apache服务器来解决这一常见问题,确保中文字符在...

    乱码问题解决

    本文将深入探讨`charset`与`pageEncoding`的区别,并结合MySQL数据库乱码问题,提供有效的解决方案。 **1.1 pageEncoding属性** `pageEncoding`是JSP页面中的一个属性,它主要用于定义JSP页面的源代码(即`.jsp`...

    struts乱码解决方法

    #### 三、具体解决方案 ##### 1. 设置JSP页面编码 在每个JSP页面顶部添加或修改`<%@ page pageEncoding="GB2312" %>`指令,以指定该页面的编码方式为GB2312。这样可以确保该页面内部所有输出都使用GB2312编码。 ...

    深入剖析JSP和Servlet对中文的处理

    #### 四、乱码问题的根源及解决方案 1. **乱码问题的根源**: - 当从一种编码格式转换到另一种编码格式时,如果目标编码格式中不存在相应的字符,就会出现乱码。例如,从GB2312编码转换到ISO8859-1编码时,由于后...

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

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

    Java-J2EE中文问题终极解决之道.doc

    本文旨在探讨Java-J2EE中文问题的终极解决之道,通过对现有解决方案的分析,提出一套全面且有效的处理方案。 #### 二、传统的解决方案及其局限性 ##### 1. 字节码转换方法 最古老的方法之一是利用`String`类的字节...

    jsp精华文章 FAQ汇萃 精选文章 论坛精华

    FAQ(Frequently Asked Questions)通常包含了开发者在实际工作中遇到的常见问题和解决方案。对于JSP来说,这可能涵盖以下几个方面: - **JSP基本语法**:理解JSP标签、脚本元素(scriptlets)、表达式和声明等基本...

    修改mysql编码的一种方法

    本文旨在探讨一种通用的解决方案,适用于各种环境下的MySQL中文乱码问题。 #### 一、理解乱码产生的原因 在深入探讨解决方案之前,我们需要先了解乱码产生的几种常见情况: 1. **写入数据库时出现乱码**:当数据...

    java实现工作流

    7. **开发难点与技术**:总结了开发过程中遇到的问题及解决方案。 8. **结束语**:对未来工作的展望和建议。 #### 二、相关技术和方法详解 ##### 2.1 工作流 **2.1.1 什么是工作流** 工作流(Workflow)是一种...

    企业网站论文

    同时,针对不同功能模块进行了详细的讲解,如投票系统、中文乱码处理以及图片处理等问题的解决方案。 #### 五、测试方法与结果 - **测试方法**:文章介绍了多种测试方法,包括界面测试、功能测试、需求测试和性能...

    大学 毕业设计 项目实训 航测进口设备管理系统.zip_设备管理系统界面

    在Windows XP环境下,Sybase数据库安装时出现乱码现象,通常与字符集编码设置有关。解决这类问题需要学生了解字符编码的基本原理,掌握如何在数据库系统中进行字符集的配置和编码转换。例如,采用UTF-8编码方案或者...

    struts从入门到精通.doc

    终极解决方案** - 探讨了如何解决Struts框架中的中文乱码问题和国际化需求。 - **3.5 为Web服务构建Struts应用程序** - 讲述了如何利用Struts框架来构建Web服务应用。 - **3.6 Struts标记库是如何工作的** - 解释...

    家政服务公司管理系统(java).docx

    - **中文处理**: 解决系统开发过程中可能出现的中文乱码问题,确保系统能够正确处理中文信息。 - **安全性设计**: 实现用户权限管理、数据加密传输等功能,保护系统和用户信息安全。 - **性能优化**: 通过缓存技术、...

Global site tag (gtag.js) - Google Analytics