javazhs16gbk_JAVA-----乱码的处理乱码的解决⽅法总结为什么说乱码是程序员⽆法避免的话题呢?这个⾸先要从编码机制上说起,⼤家都是中⽂和英⽂的编码格式不是⼀样,解码也是不⼀样的!⼯作遇到各种各样的乱码的解决⽅法总结⼀下。
sql2000数据库质疑处理对于Java由于默认的编码⽅式是 UNICODE,所以⽤中⽂也易出问题,常见的解决是strncmp 函数功能
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();
xmlHttp.open("POST",url,true);
xmlHttp.setRequestHeader( " Content-Type " , " application/x-www-form-urlencoded);
xmlHttp.send(urlmsg);
}
后台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) {
return null;
}
}
public static String GBK(String str) {
try {
return new Bytes("GBK"),"GBK");
} catch (Exception ex) {
return null;
}
win10定时运行程序}
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程序员来说,这可是⼀个不好的消息。要么改⽤其他语⾔编程,要么选择其他价格昂贵的数据库产品。“⼀次编写,到处运⾏”的⽬标,也⼤打折扣。能不能采⽤变通的⽅法,将中⽂信息进⾏处理后再存储来解决这个问题呢?答案是肯定的。
强制转换为float解决问题的具体思路、⽅法
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++){
if(bt[i]〈0){
//是汉字去⾼位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);
}
j++;
}
String tt = new String(bt2);
return tt;
}
上例在实际编程中效果很好,只是存储的中⽂信息需要经过同样处理,才能被其他系统使⽤。⽽且如果中⽂字串出现英⽂字符,实际上增加了额外的存储空间。
5、Solaris下Servlet编程的中⽂问题及解决办法
在使⽤Java开发Internet上的⼀个应⽤系统时,发现在Windows下调试完全正常的Servlet,上传到Solaris 服务器上,运⾏却出现故障——返回的⽹页不能显⽰中⽂,应为中⽂的信息全为乱码;⽤中⽂信息做关键字,不能正确检索数据库。后来采⽤加⼊检查代码等⽅法探知故障原因如下:
显⽰乱码主要是因为通过类 HttpServletResponse提供的⽅法setContentType ⽆法改变返回给客户的数据的编码⽅式,正确的编码⽅式应为GB2312或者GBK,⽽事实上为缺省的ISO8859-1。⽆法检索中⽂信息则是因为,客户提交的中⽂信息经浏览器编码到达服务器
后,Servlet⽆法将其正确解码。
举例说明显⽰乱码解决⽅法
Servlet ⼀般通常做法如下:手游sf架设一条龙代理
public class ZldTestServlet extends HttpServlet {
public void doGet (HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException{
//在使⽤ Writer向浏览器返回数据前,设置 content-type header ,在这⾥设置相应的字符集gb2312jsp中文全称
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 {
public static void main(String[] args) throws EmailException, MessagingException {
SimpleEmail email = new SimpleEmail();
email.setCharset("GB2312");
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论