【#文档大全网# 导语】以下是® 文档大全网 的小编为您整理的《中文字符集》,欢迎阅读!
最近一直被这个字符集问题, 弄的头疼。 想不到一个很好的办法去解决。 问题是这样的: “ 在 超链接中传递参数的时候总是出现乱码 ” 在 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,""),"
","");
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" %> <%= new String(request.getParameter("your_name").getBytes("8859_1"), "GB2312") %> // 新的方式 <%@ page contentType="text/html; charset=gb2312" %> <% request.setCharacterEncoding("GB2312"); %> 本文来源:https://www.wddqxz.cn/2488b30352ea551810a687a1.html