`

解析Java中文乱码(支持WebSphere)

    博客分类:
  • java
阅读更多

解决乱码的“葵花宝典”我来分享与延续.

分享至冷面阎罗http://www.blogjava.net/soddabao/archive/2007/08/13/136360.html.

 

编者说的话:为什么说乱码是中国程序员无法避免的话题呢?这个首先要从编码机制上说起,大家都是中文和英文的编码格式不是一样,解码也是不一样的!如果中国的程序员不会遇到乱码,那么只有使用汉语编程。汉语编程是怎么回事我也不大清楚,应该是前年吧,我一朋友给我介绍汉语编程,怎么不错不错?当时因为学习忙没去关注这个,等我闲了,那个朋友不弄这个,问他他也不说不大清楚,最后自己对这个学习也不了了之了。
    今天我写这个不是讲解中英文之间的差距,解码等,我是将我在这几年工作遇到各种各样的乱码的解决方法,总结一样,也希望大家能把自己晕倒解决乱码的方法都说出来,咱们弄一个解决乱码的“葵花宝典”。

 

对于Java由于默认的编码方式是 UNICODE,所以用中文也易出问题,常见的解决是

String s2 = new String(s1.getBytes("ISO-8859-1"),"UTF-8");

 1、utf8解决JSP中文乱码问题:
一般说来在每个页面的开始处,加入:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<% request.setCharacterEncoding("UTF-8"); %> 

 charset=UTF-8  的作用是指定JSP向客户端输出的编码方式为"UTF-8".
pageEncoding="UTF-8"  为了让JSP引擎能正确地解码含有中文字符的JSP页面,这在LINUX中很有效.
request.setCharacterEncoding("UTF-8"); 是对请求进行了中文编码.

 

有时,这样仍不能解决问题,还需要这样处理一下:

String msg = request.getParameter("message");
String str=new String(msg.getBytes("ISO-8859-1"),"UTF-8");
out.println(str);

 

2、Tomcat 5.5 中文乱码:

 

(1).只要把%TOMCAT安装目录%/webapps/servlets-examples/WEB-INF/classes/filters/SetCharacterEncodingFilter.class文件拷到你的webapp目录/filters下,如果没有filters目录,就创建一个。
(2).在你的web.xml里加入如下几行: 

  <filter>  
     <filter-name>Set Character Encoding</filter-name>  
     <filter-class>filters.SetCharacterEncodingFilter</filter-class>  
     <init-param>   
        <param-name>encoding</param-name>  
        <param-value>GBK</param-value>  
     </init-param>  
  </filter>  
  <filter-mapping>  
     <filter-name>Set Character Encoding</filter-name>  
     <url-pattern>/*</url-pattern>  
  </filter-mapping> 

(3).完成。
get方式的解决办法:
(1).打开tomcat的server.xml文件,找到区块,加入如下一行:URIEncoding="UTF-8"
  完整的应如下:  

<Connector    
  port="80"   maxThreads="150"   minSpareThreads="25"   maxSpareThreads="75"  
  enableLookups="false"   redirectPort="8443"   acceptCount="100"  
  debug="0"   connectionTimeout="20000"    
  disableUploadTimeout="true"    
  URIEncoding="UTF-8"  /> 

 

(2).重启tomcat,一切OK。

 

 

3、XMLHttpRequest中文问题

 

页面jsp用的UTF-8编码:
代码

<%@ page contentType="text/html; charset=GBK"%>  

 

javascript部分:

function addFracasReport() {  
    var url="servlet/encodingServlet";  
    //var urlmsg="&reportId="+fracasReport1.textReportId.value;  //故障报告表编号  
    var xmlHttp=createXmlHttpRequest() ;
    xmlHttp.onreadystatechange = function(){
		//对象的状态为4表示已完成
		if(xmlHttp.readyState==4){
			//成功返回200,没有修改返回304
			if(xmlHttp.status==200||xmlHttp.status==304){
				//开始处理信息
				//alert(xhr.responseText) ;
				alert("请求发送成功") ;
			}
		}
	}
    xmlHttp.open("POST",url,true);  
    xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
    var urlmsg = "hello=你好&world=世界"  
    xmlHttp.send(urlmsg);  
}

 此时,如果前台引用JS代码的JSP页面用的全部是UTF-8编码,那么在后获取时,不会出现乱码问题,例如在Servlet中用String hello = request.getParameter("hello") ;获取并用System.out.println(hello) ;输出到控制台上.但是如果用response.getWriter().print(hello);输出到页面上的话,会出现乱码问题,此时可以在Servlet中用response.setCharacterEncoding("UTF-8") ;进行转码.

 

 

 

4、toad的字符集的设置与oracle的安装
oracle数据库服务器的安装一般是中文字符集,有时安装在不同的平台下,设置为ISO编码,toad是oracle开发的最好工具,不是我说的,可是中文环境下安装的toad,打开英文字符的oracle时,中文全是乱码。必须进行设置.

环境变量->系统变量
加NLS_lANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK

NLS_lANG=AMERICAN_AMERICA.WE8ISO8859P1  AMERICAN_AMERICA.WE8MSWIN1252

或者

打开注册表,点击HKEY_LOCAL_MATHINE再点击Software,再点击ORACLE在点击HOME(ORACLE所在目录)在注册表的右半面有NLS_LANG,双击它,将你想要的覆盖掉原来的就可以了最好记下旧的,以便可以改回来。

connect sys/change_on_install
update props$
set value$='ZHS16CGB231280'
where name='NLS_CHARACTERSET';
commit;

这样就OK了


5.如何解決GWT(google web toolkit)中文的问题
GWT 中文乱码解决方法

(1).把你要显示的中文“测试字符串”输入到一个文件,如:1.txt
(2).进入命令行,进入1.txt所在的目录,敲入以下命令:native2ascii.exe 1.txt 2.txt 回车。这样就生成了另外一个文件2.txt。
(3).2.txt的内容如下:\u6d4b\u8bd5\u5b57\u7b26\u4e32
(4).然后用上面的编码,在gwt中使用,就可以了.


6.xmlHttp得到的网页怎么是乱码?
(1).在服务器端使用WebRequest而不是xmlHttp.
(2).将StreamReader sr = new StreamReader(stream);
对于简体中文改成:
StreamReader sr = new StreamReader(stream , Encoding.Default );
对于utf-8改成:
StreamReader sr = new StreamReader(stream , Encoding.UTF8 );
当然,Encoding枚举还有很多其他的成员,对于不同的编码content-type可以有选择的应用
(3).后来我发现无论是content-type是gb2312还是utf-8,用
StreamReader sr = new StreamReader(stream , Encoding.Default );
都可以返回正常的汉字,所以统一的改成Encoding.Default
最后,在服务器端从一个url获得网页的源代码的代码如下:

/// <summary>
/// post一个指定的url,获得网页的源代码(用WebRequest实现)
/// </summary>
/// <param name="url"></param>
/// <returns>
/// 如果请求失败,返回null
/// 如果请求成功,返回网页的源代码
/// </returns>
public static string GetContentFromUrl2( string url )
{
    //变量定义
    string respstr;

    WebRequest myWebRequest=WebRequest.Create(url);
    //            myWebRequest.PreAuthenticate=true;
    //            NetworkCredential networkCredential=new NetworkCredential( username , password , domain );
    //            myWebRequest.Credentials=networkCredential;

    // Assign the response object of 'WebRequest' to a 'WebResponse' variable.
    WebResponse myWebResponse=myWebRequest.GetResponse();
    System.IO.Stream stream = myWebResponse.GetResponseStream();
    StreamReader sr = new StreamReader(stream , Encoding.Default );
    //以字符串形式读取数据流
    respstr = sr.ReadToEnd();
    sr.Close();
  
    return respstr;
      
}

 


7.解决weblogic/webshpere中文问题:
在web.xml文件中需要配置中文环境。如下:

<context-param>
  <param-name>weblogic.httpd.inputCharset./*</param-name>
  <param-value>GB2312</param-value>
</context-param>

 

 

20120228补充如下:

 

8.利用JS过渡,在Java类中转码接收(适用WebSphere).

// 前台JS代码如下
var url = strAction+"?method=startProc&proName="+encodeURI(encodeURI('要传的汉字'));

 

// 后台Action中解码如下
zjmc = java.net.URLDecoder.decode('要传的汉字',"UTF-8");
System.out.println(zjmc) ;

  

 

 

解决HttpServletResponse输出的中文乱码问题

首先,response返回有两种,一种是字节流outputstream,一种是字符流printwrite。

申明:这里为了方便起见,所有输出都统一用UTF-8编码。

先说字节流,要输出“中国",给输出流的必须是转换为utf-8的“中国”,还要告诉浏览器,用utf8来解析数据

 

       //这句话的意思,是让浏览器用utf8来解析返回的数据
    response.setHeader("Content-type", "text/html;charset=UTF-8");
    String data = "中国";
    OutputStream ps = response.getOutputStream();
    //这句话的意思,使得放入流的数据是utf8格式
    ps.write(data.getBytes("UTF-8"));



 

再说字符流,要输出中国,需要设置response.setCharacterEncoding("UTF-8");

 

               //这句话的意思,是让浏览器用utf8来解析返回的数据
		response.setHeader("Content-type", "text/html;charset=UTF-8");
		//这句话的意思,是告诉servlet用UTF-8转码,而不是用默认的ISO8859
		response.setCharacterEncoding("UTF-8");
		String data = "中国";
		PrintWriter pw = response.getWriter();
		pw.write(data);

 

 

 

经验:

1,如果中文返回出现??字符,这表明没有加response.setCharacterEncoding("UTF-8");这句话。

2,如果返回的中文是“烇湫”这种乱码,说明浏览器的解析问题,应该检查下是否忘加response.setHeader("Content-type", "text/html;charset=UTF-8");这句话。

 

 

 

 

以上,经过总结后.

 

 

 

 

 

 

 

分享到:
评论
5 楼 ysj5125094 2013-06-04  
handleException 写道
楼主 WebSphere iframe 传值问题解决了吗

还没解决掉,绕过去了,呵呵.不过如果你能解决,你就告诉我,学习学习,呵呵.
4 楼 Credo 2013-06-03  
ysj5125094 写道
Credo 写道
非常感谢,问题解决了.谢谢LZ.

呵呵,是哪个解决乱码的方法解决了你的问题呢?我这边又遇到了个没有解决的乱码问题.是关于WebSphere如何解码的问题,贴出来,看看你能不能帮着解决下,呵呵.
前台在Jsp存放的中文,传递到别一个Jsp中,之后在这个Jsp中通过Ifreme的Src属性传递到Action中如何解码?

我在开发库中用Tomcat是可以解决这个问题的,但是到WebSphere中就解决不了了,WebSphere中是默认的字符集,没有设置.后来设置了GBK和UTF-8还有GB2312都不灵,呵呵...

先说一下我在Tomcat下是如何解码的吧:
1.在JSP中通过encodeURI(encodeURI("中文"))编码.
2.在另一个JSP中通过java脚本把传递过来的中文还原.java.net.URLDecoder.decode("中文","UTF-8");把这个中文通过Iframe的Src属性传递到后台Action
3.在Action中使用这个方法解码:String fieldname=new String (fieldname.getBytes("ISO-8859-1"),"GBK");

像这种方法在WebSphere中就不灵,求解,呵呵...

String s2 = new String(s1.getBytes("ISO-8859-1"),"UTF-8");  我那时候记得好像就是这句吧.具体关于什么,我也记不清楚了,非常抱歉啊......我ITEYE很少来....汗.
3 楼 handleException 2013-05-31  
楼主 WebSphere iframe 传值问题解决了吗
2 楼 ysj5125094 2012-04-08  
Credo 写道
非常感谢,问题解决了.谢谢LZ.

呵呵,是哪个解决乱码的方法解决了你的问题呢?我这边又遇到了个没有解决的乱码问题.是关于WebSphere如何解码的问题,贴出来,看看你能不能帮着解决下,呵呵.
前台在Jsp存放的中文,传递到别一个Jsp中,之后在这个Jsp中通过Ifreme的Src属性传递到Action中如何解码?

我在开发库中用Tomcat是可以解决这个问题的,但是到WebSphere中就解决不了了,WebSphere中是默认的字符集,没有设置.后来设置了GBK和UTF-8还有GB2312都不灵,呵呵...

先说一下我在Tomcat下是如何解码的吧:
1.在JSP中通过encodeURI(encodeURI("中文"))编码.
2.在另一个JSP中通过java脚本把传递过来的中文还原.java.net.URLDecoder.decode("中文","UTF-8");把这个中文通过Iframe的Src属性传递到后台Action
3.在Action中使用这个方法解码:String fieldname=new String (fieldname.getBytes("ISO-8859-1"),"GBK");

像这种方法在WebSphere中就不灵,求解,呵呵...
1 楼 Credo 2012-04-05  
非常感谢,问题解决了.谢谢LZ.

相关推荐

    WEBSPHERE乱码问题的解决和处理

    在IT领域中,尤其是对于使用IBM WebSphere作为应用服务器的企业来说,遇到中文乱码的问题是一件非常头疼的事情。这类问题往往会影响到业务的正常运行,降低用户体验,因此及时有效地解决问题至关重要。本文将详细...

    Websphere Application Server 6.1乱码问题解决办法

    Websphere Application Server 6.1 是 IBM 提供的一个企业级的应用服务器,它为开发和部署Web应用程序和服务提供了强大的支持。然而,在实际使用过程中,乱码问题常常困扰着开发者和管理员,尤其是在处理不同编码...

    彻底解决jsp中用SmartUpload上传附件中文乱码问题实用.pdf

    在Java Web开发中,使用SmartUpload组件上传附件时,可能会遇到中文文件名乱码的问题。这个问题通常涉及到字符编码的处理,特别是在不同的操作系统和Web服务器环境下。以下是对彻底解决该问题的详细解析: 首先,...

    aix上websphere activemq部署总结.doc

    - 在管理控制台中,可以调整Java虚拟机(JVM)的默认编码设置,例如添加-D参数 `-Ddefault.client.encoding=UTF-8 -Dfile.encoding=GBK -Duser.language=Zh -Duser.region=CN` 来改变字符集,以适应中文环境。...

    js url传值中文乱码之解决之道

    需要注意的是,有时候仅仅使用一次编码可能不足以解决所有的中文乱码问题,如在文档中提到的“在websphere中使用的是url=encodeURI(encodeURI(url));”,这意味着在某些情况下需要对URL进行两次编码才能保证数据的...

    java初学者必读

    在Java Web开发中,特别是在使用JSP和Servlet时,经常会出现中文乱码的问题。以下是一些有效的解决方法: ##### 方法一:设置Content-Type 在JSP页面头部或Servlet中设置合适的`Content-Type`来指定字符集,例如...

    JS解决url传值出现中文乱码的另类办法

    Java服务器在接收到URL参数时,如果没有正确处理字符编码,就会导致中文乱码。 传统解决乱码问题的方法是,在前端对中文数据进行编码,通常是使用`encodeURIComponent`函数将其转换为可以在URL中安全传递的形式,...

    中科软JAVA面试题

    【JAVA中文乱码】 解决中文乱码通常涉及字符编码设置,如文件编码、IDE编码、HTTP头编码、页面编码等。 【表单GET与POST】 GET将数据附在URL后面,适合少量数据且不敏感的场景;POST将数据放在请求体中,适合大量或...

    java笔试题

    为处理中文字符不出现乱码,需在`server.xml`配置文件中设置`URIEncoding="utf-8"`。 8. **JSP标记表示**: JSP标记使用`&lt;%...%&gt;`表示Java代码,`&lt;jsp:...&gt;`表示JSP动作元素,`&lt;%-- --%&gt;`表示JSP注释。 9. **JSP...

    Java Web开发工程师笔试题1.docx

    处理中文字符乱码,需在Tomcat的server.xml配置文件中设置URIEncoding="utf-8"。 8. JSP标记表示: - JSP动作标记:`&lt;jsp:action&gt;` - JSP脚本元素:`&lt;% %&gt;`(用于Java代码) - JSP表达式:`&lt;%= %&gt;`(用于输出...

    JSP-Servlet中的汉字编码问题-JSP教程

    假设在一个使用IBM WebSphere Application Server 3.5的环境中,开发者遇到了JSP/Servlet处理汉字时出现乱码的问题。此时,需要从以下几个方面入手排查: 1. **确认项目的统一编码**:检查所有源代码文件是否统一...

    myeclipse+tomcat开发环境搭建&tomcat;编程规范

    3. **URL中文乱码**:Tomcat可能需要在`server.xml`中配置URL编码,而Websphere默认处理得更好。 了解并遵循这些规范和注意事项,可以帮助开发者在MyEclipse和Tomcat环境中更顺畅地进行开发,同时提高代码的可移植...

Global site tag (gtag.js) - Google Analytics