分享

java乱码总结

 yanjj 2011-11-29

1.URL乱码

有的是,不可避免要在URL上传中文,用一些框架(spring MVC,struts)可以解决。但是我们也可以自己手动解决。

Java代码
String url = "http://www.softbeta.?name=小武"// url编码url = "http://www.softbeta.?name=" + java.net.URLEncoder.encode("小武");  System.out.println("url:" + url);  // url解码url = "http://www.softbeta.?name=" + java.net.URLDecoder.decode("小武");  System.out.println("url:" + url); 

String url = "http://www.softbeta.?name=小武";
// url编码
url = "http://www.softbeta.?name=" + java.net.URLEncoder.encode("小武");
System.out.println("url:" + url);
// url解码
url = "http://www.softbeta.?name=" + java.net.URLDecoder.decode("小武");
System.out.println("url:" + url);

encode(String s) 和 decode(String s)方法会采用系统的默认编码,已标记为@deprecated 取代为带编码的方法encode(String s, String enc),decode(String s, String enc)。

Java代码
String url = "http://www.softbeta.?name=小武"// url编码url = "http://www.softbeta.?name=" + java.net.URLEncoder.encode("小武","utf-8");  System.out.println("url:" + url);  // url解码url = "http://www.softbeta.?name=" + java.net.URLDecoder.decode("小武","utf-8");  System.out.println("url:" + url); 

String url = "http://www.softbeta.?name=小武";
// url编码
url = "http://www.softbeta.?name=" + java.net.URLEncoder.encode("小武","utf-8");
System.out.println("url:" + url);
// url解码
url = "http://www.softbeta.?name=" + java.net.URLDecoder.decode("小武","utf-8");
System.out.println("url:" + url);

url encode和decode在前端js也有很好的支持,这样能方便我们处理请求和响应。

2.JSP乱码

在基于框架开发中,JSP乱码基本上由框架解决,但是有些地方我们的编码需要统一。

在JSP文件头,一般加入:

Jsp代码
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

charset=UTF-8的作用是指定JSP向客户端输出的编码方式为"UTF-8";

pageEncoding="UTF-8",为了让JSP引擎能正确地解码含有中文字符的JSP页面;

如果对请求编码:

Java代码
request.setCharacterEncoding("UTF-8"); 

request.setCharacterEncoding("UTF-8");

还有一种是在web容器中设置编码。如Tomcat,如果上面的方法都能解决乱码,可以在server.xml修改URIEncoding:

Xml代码
<Connectorport="8088"protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8443"URIEncoding="utf-8"/>

<Connector port="8088" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" URIEncoding="utf-8"/>

3.打包文件(zip)乱码

如果用原生的java.util.zip.ZipOutputStream进行文件打包,当文件名出现中文的时候,会出现乱码,目前还没有很好的解决方法,除非修改这个类的代码,然后重新打包。

org.apache.tools.zip.ZipOutputStream用这个类进行打包可以设置编码,有效的解决中文问题。

Java代码
ZipOutputStream zos = new ZipOutputStream(os);  zos.setEncoding("GBK");  ...  zos.flush();  zos.close(); 

ZipOutputStream zos = new ZipOutputStream(os);
zos.setEncoding("GBK");
...
zos.flush();
zos.close();

4.其他情况通用解决

像文件乱码,数据库乱码...等,很多时候是方法没有用对,字符集设置不统一或没有用对。对文件读写,用正确的流,合适的编码,一般不会出问题。数据库也是一样,数据库的编码也后台处理程序编码要统一。但是还是有一些情况我们不能成功解决乱码问题,这是只有强制转码了。

Java代码
/*** 转码** @author oliver* @created 2011-10-13** @param str 需要转码的字符串* @param originEncode 原字符串编码* @param destEncode 需要转向的编码* @return* @throws UnsupportedEncodingException*/publicstatic String transcoding(String str,String originEncode,String destEncode) throws UnsupportedEncodingException{  if(str==null || str.trim()==""){  return str;      }  returnnew String(str.getBytes(originEncode),destEncode); 

/**
* 转码
*
* @author oliver
* @created 2011-10-13
*
* @param str 需要转码的字符串
* @param originEncode 原字符串编码
* @param destEncode 需要转向的编码
* @return
* @throws UnsupportedEncodingException
*/
public static String transcoding(String str,String originEncode,String destEncode) throws UnsupportedEncodingException{
if(str==null || str.trim()==""){
return str;
}
return new String(str.getBytes(originEncode),destEncode);
}

如果你知道乱码字符串以前用的编码,那么可以用上面的方法解决乱码。

在java.nio包中,也有类似编码解码的方法。

Java代码
String name="中文"Charset ct = Charset.forName("utf-8");  ByteBuffer encode = ct.encode(name);  name=ct.decode(encode).toString(); 

String name="中文";
Charset ct = Charset.forName("utf-8");
ByteBuffer encode = ct.encode(name);
name=ct.decode(encode).toString();

总之,乱码问题很多时候是由于我们的方法,工具没有选择正确,或者编码不统一。如果真的没有其他好的办法,可以自己写工具强制转码。


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多