java解析xml中⽂字符乱码_各种Java中⽂乱码的处理⽅法对于Java,由于默认的编码⽅式是UNICODE,所以⽤中⽂也易出问题,常见的解决是:
String s2 = new Bytes(“ISO-8859-1”),”GBK”);
1、utf8解决JSP中⽂乱码问题
⼀般说来在每个页⾯的开始处,加⼊:
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 = Parameter("message");
String str=new Bytes("ISO-8859-1"),"UTF-8");
out.println(st);
2、Tomcat 5.5中⽂乱码
只要把%TOMCAT安装⽬录%/ webapps\servlets-examples\WEB-INF\classes\filters\SetCharacterEncodingFilter.class⽂件拷到你的webapp⽬录/filters下,如果没有filters⽬录,就创建⼀个。
2)在你的l⾥加⼊如下⼏⾏:
Set Character Encoding
filters.SetCharacterEncodingFilter
encoding
GBK
Set Character Encoding
/*
3)完成
2、get⽅式的解决办法
1)打开tomcat的l⽂件,到区块,加⼊如下⼀⾏:
URIEncoding=”GBK”
完整的应如下:
port="80" maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" redirectPort="8443" acceptCount="100"
debug="0" connectionTimeout="20000"
disableUploadTimeout="true"
URIEncoding="GBK"
/>
2)重启tomcat,⼀切OK。
3、xmlHttpRequest中⽂问题
页⾯jsp⽤的GBK编码
代码:
javascript部分
代码:
function addFracasReport() {
var url="controler?actionId=0_06_03_01&actionFlag=0010";
var urlmsg="&reportId="+ReportId.value; //故障报告表编号
var ateXMLHttpRequest();
eval("turnAnalyPage"));
xmlHttp.open("POST",url,true);
xmlHttp.setRequestHeader( " Content-Type " , "
application/x-www-form-urlencoded);
xmlHttp.send(urlmsg);
}
#p#
后台java中获得的reportId是乱码,不知道该怎么转,主要是不知道xmlHttp.send(urlmsg);以后是什么编码?在后⾯⽤java来转,试了⼏种,都没有成功,其中有:
代码:
public static String UTF_8ToGBK(String str) {
try {
return new Bytes("UTF-8"), "GBK");
} catch (Exception ex) {
return null;
}
}
public static String UTF8ToGBK(String str) {
try {
return new Bytes("UTF-16BE"), "GBK");
} catch (Exception ex) {
}
}
public static String GBK(String str) {
try {
return new Bytes("GBK"),"GBK");
} catch (Exception ex) {
return null;
}
}
public static String getStr(String str) {
try {
String temp_p = str;
String temp = new String(Bytes("ISO8859_1"), "GBK");
temp = sqlStrchop(temp);
return temp;
} catch (Exception e) {
return null;
}
}
4、JDBC ODBC Bridge的Bug及其解决⽅法
在编写⼀数据库管理程序时,发现JDBC-ODBC Bridge存在不易发现的Bug。在向数据表插⼊数据时,
如果为英⽂字符,存储内容完全正确,如果存⼊中⽂字符,部分数据库只能存储前七⼋个中⽂字符,其他内容被截去,导致存储内容的不完整(有些数据库不存在这个问题,如Sybase SQL Anywhere 5.0。JDBC-ODBC Bridge还存在⽆法建表的Bug)。
对于⼴⼤需要存储中⽂信息的Java程序员来说,这可是⼀个不好的消息。要么改⽤其他语⾔编程,要么选择其他价格昂贵的数据库产品。“⼀次编写,到处运⾏”的⽬标,也⼤打折扣。能不能采⽤变通的⽅法,将中⽂信息进⾏处理后再存储来解决这个问题呢?答案是肯定的。
解决问题的具体思路、⽅法
Java采⽤Unicode码编码⽅式,中英⽂字符均采⽤16bit存储。既然存储英⽂信息是正确的,根据⼀定规则,将中⽂信息转换成英⽂信息后存储,⾃然不会出现截尾现象。读取信息时再进⾏逆向操作,将英⽂信息还原成中⽂信息即可。由GB2312编码规则可知,汉字⼀般为⼆个⾼位为1的ASCII码,在转换时将⼀个汉字的⼆个⾼位1去掉,还原时再将⼆个⾼位1加上。为了处理含有英⽂字符的中⽂字串,对英⽂字符则需要加上⼀个Byte 0标记。以下提供的两个公⽤静态⽅法,可加⼊任何⼀个类中使⽤。
将中英⽂字串转换成纯英⽂字串
public static String toTureAsciiStr(String str){
StringBuffer sb = new StringBuffer();
byte[] bt = Bytes();
for(int i =0 ;i〈bt.length;i++){
//是汉字去⾼位1
sb.append((char)(bt[i]&&0x7f));
}else{//是英⽂字符 补0作记录
sb.append((char)0);
sb.append((char)bt[i]);
}
}
String();
}
将经转换的字串还原
public static String unToTrueAsciiStr(String str){
byte[] bt = Bytes();
int i,l=0,length = bt.length,j=0;
for(i = 0;i〈length;i++){
if(bt[i] == 0){
l++;
}
}
byte []bt2 = new byte[length-l];
for(i =0 ;i〈length;i++){
if(bt[i] == 0){
i++;
bt2[j] = bt[i];
}else{
bt2[j] = (byte)(bt[i]|0x80);
中文字符unicode查询}
j++;
}
String tt = new String(bt2);
return tt;
}
上例在实际编程中效果很好,只是存储的中⽂信息需要经过同样处理,才能被其他系统使⽤。⽽且如果中⽂字串出现英⽂字符,实际上增加了额外的存储空间。
#p#
5、Solaris下Servlet编程的中⽂问题及解决办法
在使⽤Java开发Internet上的⼀个应⽤系统时,发现在Windows下调试完全正常的Servlet,上传到Solaris服务器上,运⾏却出现故障——返回的⽹页不能显⽰中⽂,应为中⽂的信息全为乱码;⽤中⽂信息做关键字,不能正确检索数据库。后来采⽤加⼊检查代码等⽅法探知故障原因如下:
显⽰乱码主要是因为通过类HttpServletResponse提供的⽅法setContentType⽆法改变返回给客户的数据的编码⽅式,正确的编码⽅式应为GB2312或者GBK,⽽事实上为缺省的ISO8859-1。⽆法检索中⽂信息则是因为,客户提交的中⽂信息经浏览器编码到达服务器
后,Servlet⽆法将其正确解码。
举例说明显⽰乱码解决⽅法
Servlet⼀般通常做法如下:
public class ZldTestServlet extends HttpServlet {
public void doGet (HttpServletRequest request,
HttpServletResponse response)throws ServletException,IOException{
//在使⽤ Writer向浏览器返回数据前,设置 content-type header,在这⾥设置相应的字符集gb2312
response.setContentType("text/html;charset=gb2312");
PrintWriter out = Writer(); //*
// 正式返回数据
out.println("〈html〉〈head〉〈title〉Servlet test〈/title〉〈/head〉" );
out.println("这是⼀个测试页!");
out.println("〈/body〉〈/html〉");
out.close();
}
...
}
解决页⾯显⽰乱码问题,需将*处代码换成如下内容:
PrintWriter out = new PrintWriter(new OutputStream(),"gb2312"));
Solaris中⽂信息检索问题的解决
浏览器利⽤表单向服务器提交信息时,⼀般采⽤x-www-form-urlencoded 的MIME格式对数据进⾏编码。如果使⽤get⽅法,参数名称和参数值经编码后附加在URL后,在Java中称作查询串(query string)。
在Servlet程序中,如果采⽤ServletRequest的⽅法getParameter取得参数值,在Solaris环境下,对汉字却不能正确解码。因⽽⽆法正确检索数据库。
在Java 1.2的包——java中提供了URLEncode和URLDecode类。类URLEncode提供了按x-www-form-urlencoded格式对给定串进⾏转换的⽅法。类URLEncode则提供了逆⽅法。
6、Common Mail乱码问题
common mail是⼀个⼩⽽⽅便的mail包,他实现了对Java Mail的封装,使⽤起来⼗分的⽅便,但是我在使⽤他的时候发现,使⽤纯⽂本的内容发送,结果是乱码,代码如下:
public class TestCommonMail {
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论