java 乱码

本文总结了多种场景下的中文乱码解决方法,包括Java、Tomcat、XMLHttpRequest、Toad及Oracle、GWT、WebLogic/WebSphere等环境,并提供了解决HttpServletResponse输出中文乱码的技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

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

Java代码   收藏代码
  1. String s2 = new String(s1.getBytes("ISO-8859-1"),"UTF-8");  

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

Jsp代码   收藏代码
  1. <%@ page language="java" contentType="text/html; charset=UTF-8"  
  2.     pageEncoding="UTF-8"%>  
  3. <% request.setCharacterEncoding("UTF-8"); %>   

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

 

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

Java代码   收藏代码
  1. String msg = request.getParameter("message");  
  2. String str=new String(msg.getBytes("ISO-8859-1"),"UTF-8");  
  3. out.println(str);  

 

2、Tomcat 5.5 中文乱码:

 

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

Xml代码   收藏代码
  1. <filter>    
  2.    <filter-name>Set Character Encoding</filter-name>    
  3.    <filter-class>filters.SetCharacterEncodingFilter</filter-class>    
  4.    <init-param>     
  5.       <param-name>encoding</param-name>    
  6.       <param-value>GBK</param-value>    
  7.    </init-param>    
  8. </filter>    
  9. <filter-mapping>    
  10.    <filter-name>Set Character Encoding</filter-name>    
  11.    <url-pattern>/*</url-pattern>    
  12. </filter-mapping>   

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

Java代码   收藏代码
  1. <Connector      
  2.   port="80"   maxThreads="150"   minSpareThreads="25"   maxSpareThreads="75"    
  3.   enableLookups="false"   redirectPort="8443"   acceptCount="100"    
  4.   debug="0"   connectionTimeout="20000"      
  5.   disableUploadTimeout="true"      
  6.   URIEncoding="UTF-8"  />   

 

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

 

 

3、XMLHttpRequest中文问题

 

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

Jsp代码   收藏代码
  1. <%@ page contentType="text/html; charset=GBK"%>    

 

javascript部分:

Js代码   收藏代码
  1. function addFracasReport() {    
  2.     var url="servlet/encodingServlet";    
  3.     //var urlmsg="&reportId="+fracasReport1.textReportId.value;  //故障报告表编号    
  4.     var xmlHttp=createXmlHttpRequest() ;  
  5.     xmlHttp.onreadystatechange = function(){  
  6.         //对象的状态为4表示已完成  
  7.         if(xmlHttp.readyState==4){  
  8.             //成功返回200,没有修改返回304  
  9.             if(xmlHttp.status==200||xmlHttp.status==304){  
  10.                 //开始处理信息  
  11.                 //alert(xhr.responseText) ;  
  12.                 alert("请求发送成功") ;  
  13.             }  
  14.         }  
  15.     }  
  16.     xmlHttp.open("POST",url,true);    
  17.     xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");  
  18.     var urlmsg = "hello=你好&world=世界"    
  19.     xmlHttp.send(urlmsg);    
  20. }  

 此时,如果前台引用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,双击它,将你想要的覆盖掉原来的就可以了最好记下旧的,以便可以改回来。

Sql代码   收藏代码
  1. connect sys/change_on_install  
  2. update props$  
  3. set value$='ZHS16CGB231280'  
  4. where name='NLS_CHARACTERSET';  
  5. 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获得网页的源代码的代码如下:

Java代码   收藏代码
  1. /// <summary>  
  2. /// post一个指定的url,获得网页的源代码(用WebRequest实现)  
  3. /// </summary>  
  4. /// <param name="url"></param>  
  5. /// <returns>  
  6. /// 如果请求失败,返回null  
  7. /// 如果请求成功,返回网页的源代码  
  8. /// </returns>  
  9. public static string GetContentFromUrl2( string url )  
  10. {  
  11.     //变量定义  
  12.     string respstr;  
  13.   
  14.     WebRequest myWebRequest=WebRequest.Create(url);  
  15.     //            myWebRequest.PreAuthenticate=true;  
  16.     //            NetworkCredential networkCredential=new NetworkCredential( username , password , domain );  
  17.     //            myWebRequest.Credentials=networkCredential;  
  18.   
  19.     // Assign the response object of 'WebRequest' to a 'WebResponse' variable.  
  20.     WebResponse myWebResponse=myWebRequest.GetResponse();  
  21.     System.IO.Stream stream = myWebResponse.GetResponseStream();  
  22.     StreamReader sr = new StreamReader(stream , Encoding.Default );  
  23.     //以字符串形式读取数据流  
  24.     respstr = sr.ReadToEnd();  
  25.     sr.Close();  
  26.     
  27.     return respstr;  
  28.         
  29. }  

 


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

Xml代码   收藏代码
  1. <context-param>  
  2.   <param-name>weblogic.httpd.inputCharset./*</param-name>  
  3.   <param-value>GB2312</param-value>  
  4. </context-param>  

 

 

20120228补充如下:

 

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

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

 

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

  

 

 

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

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

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

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

 

Html代码   收藏代码
  1.        //这句话的意思,是让浏览器用utf8来解析返回的数据  
  2.     <strong style="background-color: #ffff66;">response</strong>.setHeader("Content-type", "text/html;charset=UTF-8");  
  3.     String data = "中国";  
  4.     OutputStream ps = <strong style="background-color: #ffff66;">response</strong>.getOutputStream();  
  5.     //这句话的意思,使得放入流的数据是utf8格式  
  6.     ps.write(data.getBytes("UTF-8"));  



 

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

 

Html代码   收藏代码
  1.              //这句话的意思,是让浏览器用utf8来解析返回的数据  
  2. <strong style="background-color: #ffff66;">response</strong>.setHeader("Content-type", "text/html;charset=UTF-8");  
  3. //这句话的意思,是告诉servlet用UTF-8转码,而不是用默认的ISO8859  
  4. <strong style="background-color: #ffff66;">response</strong>.setCharacterEncoding("UTF-8");  
  5. String data = "中国";  
  6. PrintWriter pw = <strong style="background-color: #ffff66;">response</strong>.getWriter();  
  7. pw.write(data);  

 

 

 

经验:

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

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


最后 还有更好的服务器端出现传输乱码问题。最好的解决方案


将包含汉字的字符串转换成英文:

Java代码   收藏代码
  1. /** 
  2.      * 将中英文字串转换成纯英文字串  
  3.      * @param str 
  4.      * @return 
  5.      */  
  6.     public static String toTureAsciiStr(String str) {  
  7.         StringBuffer sb = new StringBuffer();   
  8.         byte[] bt = str.getBytes();   
  9.           
  10.         for(int i =0 ;i<bt.length;i++){  
  11.             if(bt[i]<0){  
  12.                 //是汉字去高位1   
  13.                 sb.append((char)(bt[i] & 0x7F));   
  14.             }else{  
  15.                 //是英文字符 补0作记录  
  16.                 sb.append((char)0);  
  17.                 sb.append((char)bt[i]);  
  18.             }   
  19.         }  
  20.         return sb.toString();   
  21.     }  

 将转换后的字符串还原:

Java代码   收藏代码
  1. /** 
  2.      * 将经转换的字串还原  
  3.      * @param str 
  4.      * @return 
  5.      */  
  6.     public static String unToTrueAsciiStr(String str){  
  7.         byte[] bt = str.getBytes();  
  8.         int i,l=0,length = bt.length,j=0;   
  9.         for(i = 0;i<length;i++){  
  10.             if(bt[i] == 0){  
  11.                 l++;  
  12.             }  
  13.         }   
  14.         byte[] bt2 = new byte[length-l];   
  15.         for(i =0 ;i<length;i++){  
  16.             if(bt[i] == 0){  
  17.                 i++;  
  18.                 bt2[j] = bt[i];  
  19.             }else{  
  20.                 bt2[j] = (byte)(bt[i]|0x80);  
  21.             }  
  22.             j++;  
  23.         }   
  24.         String tt = new String(bt2);  
  25.         return tt;   
  26.     }  

 注意:上例在实际编程中效果很好,只是存储的中文信息需要经过同样处理,才能被其他系统使用。而且如果中文字串出现英文字符,实际上增加了额外的存储空间。


<think>好的,用户想解决Java程序中的乱码问题。首先,我需要回忆一下常见的乱码原因和解决方案。根据提供的引用内容,乱码通常涉及编码不一致,比如文件编码、传输编码、数据库编码等不匹配。 首先,用户提到的是Java程序中的乱码,可能涉及多个方面,比如文件读取、网络传输、数据库交互或页面显示。需要分步骤分析可能的问题点。例如,在文件读取时,如果文件保存的编码和程序读取时使用的编码不一致,就会导致乱码。这时候需要确保两者编码一致,比如使用UTF-8。 接下来,网络传输方面,比如HTTP请求或响应,如果没有正确设置Content-Type头中的字符编码,也可能出现乱码。需要检查是否在Servlet中设置了response.setCharacterEncoding("UTF-8"),或者GET请求参数在URL中的编码是否正确处理。 数据库部分,连接字符串中的字符编码设置也很重要。比如MySQL的jdbc连接参数中需要指定useUnicode和characterEncoding为UTF-8,确保数据库存储和读取时的编码一致。 还有JSP页面,如果未在页面头部指定pageEncoding和contentType的编码,浏览器可能无法正确解析,导致显示乱码。这时候需要添加<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>这样的指令。 另外,Java内部处理字符串时默认使用Unicode,但如果在转换字节数组时未指定正确的编码,比如使用new String(byteArr, "UTF-8"),也会引发问题。需要确保所有转换都明确指定编码格式。 用户提供的引用中,引用[1]提到了解决方案大全,引用[2]分析了原因和解决方案,引用[3]则讨论了JSP中的乱码。综合这些信息,应该分模块给出具体的解决步骤,比如文件、网络、数据库、页面等不同场景下的处理方法,并强调统一编码为UTF-8的重要性。 可能还需要提醒用户检查IDE或编辑器的默认编码设置,比如Eclipse或IntelliJ中的项目编码配置,避免文件保存时使用其他编码。此外,处理GET请求的URIEncoding也需要在服务器配置中设置,比如Tomcat的server.xml中的Connector配置。 最后,生成的相关问题需要围绕Java乱码的不同方面展开,比如原因分析、JSP处理、数据库设置等,帮助用户全面理解问题。</think>### Java程序乱码问题的解决方案 Java程序中的乱码通常由**编码不一致**引起,涉及文件、网络传输、数据库、页面显示等环节。以下是分步骤解决方案: --- #### **一、确认编码统一性** 1. **统一使用UTF-8编码** - 所有环节(代码文件、数据库、网络传输、页面显示)需统一为UTF-8编码。 - 检查IDE设置:在Eclipse/IntelliJ中,设置项目编码为UTF-8(路径:`File > Settings > Editor > File Encodings`)[^2]。 --- #### **二、文件读写乱码** 1. **读取文件时指定编码** ```java BufferedReader reader = new BufferedReader( new InputStreamReader(new FileInputStream("file.txt"), StandardCharsets.UTF_8) ); ``` - 避免依赖系统默认编码,显式指定`UTF-8`。 2. **写入文件时同理** ```java BufferedWriter writer = new BufferedWriter( new OutputStreamWriter(new FileOutputStream("output.txt"), StandardCharsets.UTF_8) ); ``` --- #### **三、网络传输乱码** 1. **HTTP请求/响应编码设置** - **Servlet响应**:设置响应头编码 ```java response.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); ``` - **GET请求参数**:Tomcat中配置`URIEncoding="UTF-8"`(修改`conf/server.xml`)[^3]: ```xml <Connector port="8080" URIEncoding="UTF-8" ... /> ``` --- #### **四、数据库乱码** 1. **连接字符串配置** - MySQL示例: ```java jdbc:mysql://localhost:3306/db?useUnicode=true&characterEncoding=UTF-8 ``` - 确保数据库表的字符集为UTF-8: ```sql ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4; ``` --- #### **五、JSP页面乱码** 1. **页面头部声明编码** ```jsp <%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%> ``` 2. **HTML中设置Meta标签** ```html <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> ``` --- #### **六、Java字符串与字节转换** - 字节数组转字符串时指定编码: ```java String str = new String(byteArray, StandardCharsets.UTF_8); ``` - 字符串转字节数组同理: ```java byte[] bytes = str.getBytes(StandardCharsets.UTF_8); ``` --- ### 关键排查点 | 场景 | 检查点 | |--------------|----------------------------------| | 文件读写 | 文件保存编码与读取编码是否一致 | | 网络传输 | HTTP头、服务器配置是否声明UTF-8 | | 数据库 | 连接参数、表字段字符集是否为UTF-8 | | JSP/HTML页面 | 页面编码声明、Meta标签是否设置 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值