最近一直被这个字符集问题,弄的头疼。
想不到一个很好的办法去解决。
问题是这样的:“在超链接中传递参数的时候总是出现乱码”在Action中用debug查的时候就是乱码,在Tomcat 中把Service.xml将字符集改成UTF-8,GBK,GB2312都试过了,仍然没有解决这个问题。
很是郁闷!~~~
在现实工作中我们会经常遇到字符转换的问题:有的时候还会出现乱码.因为工作需要我从别人的静态网页上抓取数据.用到的方法是传一个uri进去,然后取出你所想得到的字符串.代码如下:
public static String getData(String url1) throws Exception {
String result = "";
URL url = new URL(url1);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoOutput(true);
PrintWriter out = new PrintWriter(connection.getOutputStream());
out.close();
BufferedReader in = new BufferedReader(new InputStreamReader(connection.
getInputStream(),"UTF-8"));
//特别注意这里,后面的编码格式,一般都是用UTF-8,因为这是通用的.如果用汉字可以用GBK.不要用gb2312.因为它是GBK的子集.
String line;
while ( (line = in.readLine()) != null) {
result = result + "\n" + line;
}
in.close();
String html =replaceFunc2(replaceFunc2(result,"<?xml","<p>"),"</p>","</wml>");
return html;
}
public static String replaceFunc2(String str_source, String str_start,String str_end)
{
String info = "", rep_str = "", rep_str2 = "";
int startFlag = 0, endFlag = 0;
startFlag = str_source.indexOf(str_start);
endFlag = str_source.indexOf(str_end);
info = str_source;
if (startFlag >= 0 && endFlag >= 0 && startFlag < endFlag) {
rep_str = info.substring(0, startFlag);
rep_str2 = info.substring(endFlag + str_end.length());
info = rep_str + rep_str2;
}
// System.out.print("==========="+info+"==========");
return info;
}
这样我们取的时候就是强制它用UTF-8的格式从网页中读取出来,而不用它自己默认的编码方式(鬼知道它是用的什么编码格式,因为我是从aspx?xxx动态网页中取的,),听说有一种方法可以查出来它是用的什么编码方式,估计没多少人有这耐心去查.只要读取时用某种格式强制读取就可以,然后用相同的编码方式显示出来,一般没有什么问题.
还有一个就是听别人说的,如果还是出现乱码,哪就先把它转化成unicode格式(UTF-16),这种格式我原来没听说过,又学了一种格式,然后再转成UTF-8的格式.
下面是一些方法.从网上转来的:
网页写的中文不需要转换,写上你那行就可以显示中文了。
凡从jsp传出带中文值的参数,都需要在接收后转换中文<%@ page contentType="text/html; charset=GB2312"%> 是要在本页显示中文的时候才写。
它不能完成转换中文的功能。
中文问题是java世界里面一个比较麻烦的问题,说麻烦是因为涉及面太宽,由数据库方面的,操作系统的,webserver的等等。
一般这个就可以了:
str = new String(str.getBytes("编码1"),"编码2");其中编码1是操作系统的默认编码,编码2是你要转换成的编码。
new String()里面的部分的意思是:把str转按照编码1的方式转换回byte[] 字节流,然后按照编码2的方式再转换成新的str。
(str是一个字符串,java里面其实是char[])。
str = new String(str.getBytes(),"编码2");编码1省略也是可以的,会按照操作系统的默认编码来转换。
其中编码2一般为gb2312,也就是中文,但是推荐用gbk,因为gb2312其实是gbk的一个子集,字库要小一些。
utf-8应该也可以,是较新的一种编码规则。
Java Servlets 2.3规范草案在ServletRequest接口中新增了一个方法setCharacterEncoding(String enc),可以补上在HTTP请求中缺少的charset信息,而上面这一烦琐的转换过程就在Servlet引擎中自动完成了,而且Servlet引擎还对转换过程做了优化,提高了运行效率。
下面给出一个简单的例子,大家可以做一下比较。
// 传统方式
<%@ page contentType="text/html; charset=gb2312" %>
<html>
<body>
<form method=post action=test.jsp>
<input type=text name=your_name>
</form>
<%= new String(request.getParameter("your_name").getBytes("8859_1"), "GB2312") %>
</body>
</html>
// 新的方式
<%@ page contentType="text/html; charset=gb2312" %>
<% request.setCharacterEncoding("GB2312"); %>
<html>
<body>
<form method=post action=test.jsp>
<input type=text name=your_name>
</form>
<%= request.getParameter("your_name") %>
</body>
</html>
比较常用的SmartUpload中,可能不支持中文,需要修改:
response.setHeader("Content-Disposition","attachment;filename="+.URLEncoder.encode( (attachname,"utf-8/iso-8895-1/gb2312")));将attachname编码格式修改才可以使得在弹出的下载确认框中显示中文
一般来说可以有两个方法:
1.URLEncoder.encode(str,"utf-8");按utf-8编码输出
2.String temp=str;
str= new String(tempgetBytes(), "iso-8859-1");
当然这和你的系统编码有关系,一般建议使用utf-8编码。
当然,也不止上面两个方法,比如可以转换成gbk等,只要你熟悉你的字符串和系统的编码方式,如何转码就很容易了。
当然这两种方法都有些局限性,但一般情况下是够用了,对于跨操作系统,跨语言的环境,略微有些问题,这和你操作系统的字符库有关系。
希望跟我有着同样烦恼的兄弟们,能有些帮助~~~~。