近日,一个同事问我,在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时。URL中文乱码问题主要是由于URL编码和解码过程中的不一致导致的。下面将详细介绍如何解决这个问题,并探讨几种常用的方法。 首先,我们需要...
在Java项目开发中,尤其是使用JSP技术时,经常遇到的中文乱码问题是一个常见的困扰。这涉及到编码和解码的过程,以及不同平台和环境之间的兼容性问题。Java的默认编码是Unicode,而中文文件和数据库通常使用GB2312或...
Java 中文乱码解决方案 Java 中文乱码是指在 Java 应用程序中,中文字符在传输、存储和显示过程中出现的乱码问题。这种问题可能会出现在 Java 与数据库、JSP、文件流之间的数据交换过程中。本文将总结 Java 中文...
在JavaServer Pages (JSP) 开发中,页面间的参数传递是常见的操作,尤其是在处理包含汉字的参数时,由于编码问题可能会导致乱码。本文主要介绍如何在JSP中正确地进行汉字参数的转码与解码,确保数据在页面间传递时...
JSP/HTML页面乱码 确保JSP或HTML页面头部声明的字符集为UTF-8,例如在`<head>`标签中添加`; charset=UTF-8">`。此外,也可以通过`page`指令来设置JSP页面的字符编码,例如`<%@ page language="java" contentType=...
页面显示乱码是最常见的问题,主要原因是数据库在取出数据时没有进行正确的转码,导致本应正确显示的汉字变成了乱码。而导出文件乱码则是因为服务器操作系统字体未安装完整,特别是在导出PDF文件时,由于缺少中文...
本文针对Java Web开发中字符编码问题进行探讨,主要围绕字符编码的种类、设置方式以及不同页面类型的代码编写差异,分析中文乱码的成因,并提出解决方案,旨在为初学者提供解决中文乱码问题的思路。 首先,计算机...
接下来,我们将围绕“页面间跳转乱码”的问题,从多个角度进行深入分析,并给出相应的解决方案。 ### 一、问题背景 在Web应用中,页面之间的跳转通常伴随着参数的传递,这些参数可能包括用户的输入数据,如姓名、...
"ASCII编码转码工具"是针对处理ASCII与非ASCII编码之间转换的软件,它可以有效地解决字符乱码问题。这类工具通常提供两种操作方式:直接输入转码和文件方式转码。直接输入转码允许用户手动输入ASCII编码的字符串,并...
jsp中文乱码问题详解 在jsp中文乱码问题中,乱码的出现是由于编码格式不一致所导致的。在jsp文件中,存在三个地方的编码格式:jsp文件的存储格式、解码格式和控制浏览器的解码方式。如果这三个地方的编码格式不一致...
本文将深入探讨Java和JSP中的中文乱码问题及其解决方案。 首先,我们要明白Java和JSP的内核是基于Unicode的,这确保了程序的跨平台性,但也意味着在处理非Unicode编码(如GBK或GB2312)时可能出现乱码。乱码问题...
本文将深入探讨Java环境中出现乱码的原因及其解决方案,帮助读者彻底理解并解决这一常见问题。 #### 二、乱码产生的原因 乱码的根本原因是编码不一致导致的。当一个字符从一种编码格式被错误地解释为另一种编码...
在开发Java Web应用程序时,JSP(JavaServer Pages)页面经常遇到字符编码问题,导致页面显示乱码。本文将深入探讨“JSP乱码”的多种解决方案,并提供实用的解决策略。 1. **理解字符编码的基本概念** - 字符编码...
- **手动转码**:在客户端或者服务器端对请求参数进行转码处理。 服务器端示例: ```java String name = request.getParameter("name"); String name1 = new String(name.getBytes("ISO-8859-1"), "UTF-8");...
本文主要讨论的是第二种情况,即HTML超链接中文乱码问题的分析与解决。 在Web应用程序中,当需要在超链接(`<a>`标签)中包含中文参数作为GET请求的一部分时,必须确保这些中文字符被正确编码。这是因为URL本身只能...
`Html.java`可能包含了生成HTML分页链接的方法,而`Str.java`可能包含了处理字符串(如中文字符)的相关函数,如转码、检查乱码等。 总的来说,理解和熟练运用这些Java函数对于进行J2EE开发至关重要,它们帮助我们...
Struts2是一个非常流行的Java Web框架,用于构建可维护、高效且易于扩展的企业级应用程序。在Struts2中,国际化(i18n)是一项重要功能,它允许开发者为不同地区的用户提供本地化的应用体验。`native2ascii`工具是...
charset=iso8859-1" %>` 设置了页面内容的类型及编码方式。这里的`iso8859-1`是一种常用的西欧字符集,如果页面中有非西欧字符,就会出现乱码。 ### 二、编码不一致导致的乱码 #### 1. 页面编码与服务器接收编码不...
- **写入数据**:在写入数据时,若直接使用JSP页面的中文字符串,可能会因为编码转换不当导致乱码。此时,需要在写入前对字符串进行转码,例如将GBK编码的字符串`s1`转换为ISO-8859-1编码:`String s2 = new String...