关于乱码处理遇到的问题
来源:互联网 发布:财经重要数据 编辑:程序博客网 时间:2024/05/16 16:09
查看原文:http://www.ibloger.net/article/158.html
有时候,做开发时,我们无法要求客户对字符集的更改,最近遇到一个中文字符问题挺让人蛋疼的,在IE和火狐上测试,经过new String(keyWorld.getBytes("iso-8859-1"),"gbk"); 转换可以将url上的中文解码,但是在360浏览器上却无法解析;使用360浏览器经过new String(keyWorld.getBytes("iso-8859-1"),"utf-8"); 可以解码成功,在IE和火狐上又是乱码。
在Servlet上设置了setCharacterEncoding无效以后,着实让我蛋疼一阵儿.
request.setCharacterEncoding("utf-8");response.setCharacterEncoding("utf-8");response.setContentType("text/html;charset=UTF-8");经过查看java中没有提供String对乱码的验证,后来经过考虑,尝试使用正则判断,排除乱码产生的特殊字符,虽说不是很严禁,个人觉得对付一般的乱码问题还是可以应付的。
<span style="white-space:pre"></span>String keyWorld = request.getParameter("keyword");String kw = new String(keyWorld.getBytes("iso-8859-1"),"gbk");String kw2 = new String(keyWorld.getBytes("iso-8859-1"),"utf-8");keyWorld = keyWorld != null ? keyWorld.trim().toLowerCase() : "";String reg = "^[A-Za-z0-9\u4e00-\u9fa5]+$";// 正则字符,验证特殊制符Pattern pattern = Pattern.compile(reg);Matcher matcher = pattern.matcher(keyWorld);Matcher matcher2 = pattern.matcher(kw);Matcher matcher3 = pattern.matcher(kw2);if (matcher.find()) {System.out.println("有乱码1:"+keyWorld);}else{if(matcher2.find()){System.out.println("乱码转换gbk格式成功:"+kw);keyWorld = kw;}else{System.out.println("有乱码,gbk格式转换失败:"+kw);if(matcher3.find()){System.out.println("乱码转换utf-8格式成功:"+kw2);keyWorld = kw2;}else{System.out.println("有乱码,非utf-8和gbk编码格式");}}}System.out.println("keyWorld: "+keyWorld);示例打印如下:
乱码转换gbk格式成功:东乱码转换gbk格式成功:东有乱码,gbk格式转换失败:涓?乱码转换utf-8格式成功:东一般乱码在转换过程中失败后会产生???的模式,还有些会是¶« ,等等
其实还有一种办法是最为实用的,极力推荐,使用java包中自带的URLEncoder和URLDecoder类,给中文参数进行加码拼接在Url参数上,在后台再解码,在加码和解码过程中最好加上字符集
例如: System.out.println(URLEncoder.encode("发财了","gbk")); // 结果 %B7%A2%B2%C6%C1%CB
System.out.println(URLEncoder.encode("发财了","utf-8")); // 结果 %E5%8F%91%E8%B4%A2%E4%BA%86
另外还因为它遇到过这样一个问题,如下面的使用HTTPClient 4.3版本中的的get方式获取内容,如果直接让keyword=西,这个时候虽然可以在浏览器的地址栏在直接输出,但是在后台的httpclient中却或得不到数据,这是因为有些浏览器可以直接将中文进行转码。所以可以将httpclient简单的理解为需要手动中文转码的浏览器。
CloseableHttpClient httpClient = null;try {httpClient = HttpClientBuilder.create().build();String url = "http://localhost:8080/DCMapService/servlet/ProxyServlet?type=adder_query&request=Key&keyword="+URLEncoder.encode("西","gbk")+"&start=0&num=2";HttpGet httpGet = new HttpGet(url);HttpResponse response = httpClient.execute(httpGet);System.out.println(httpGet.getURI());HttpEntity entity = response.getEntity();// 判断响应实体是否为空if (entity != null) {System.out.println("\n查询“西”,响应内容:" + EntityUtils.toString(entity, "gbk"));}} catch (Exception e) {e.printStackTrace();} finally {try {// 关闭或释放资源httpClient.close();} catch (IOException e) {e.printStackTrace();}}
- 关于乱码处理遇到的问题
- 关于开发时遇到的乱码问题
- 关于eclipse乱码问题的处理
- 遇到的乱码问题
- JavaWeb中常常遇到的乱码问题处理-更正
- 今天遇到的关于重定向地址栏乱码的问题
- 关于mercurial转换subversion库遇到的文件乱码问题
- 今天遇到的问题 _ 关于asp错误处理
- 关于mysql绿色版安装遇到问题的处理
- 关于FileZilla 连接公司FTP乱码问题的处理
- 关于html改为jsp乱码问题的处理
- 关于 Ajax Post 的乱码问题处理方法
- python中关于处理汉字乱码的问题
- 关于java中数据库处理时的乱码问题
- jQuery中getScript方法引入外部js文件,乱码处理(自己遇到的问题)
- 关于如何去处理myeclipse乱码问题
- 处理内核遇到的问题
- 怎样处理乱码的问题
- hihoCoder1039 - 字符消除
- V$UNDOSTAT 和 V$ROLLSTAT
- php HTTP_X_FORWARDED_FOR 和 REMOTE_ADDR的使用
- c#3.0后增加知识总结
- CentOS7安装JDK1.7
- 关于乱码处理遇到的问题
- Swift 实现简单自定义TableViewCell
- J2EE中设置和获取cookie
- Osmdroid 离线地图存放位置的研究和详细分析
- 64位平台C/C++开发注意事项
- 如何查看hadoop程序中自己添加的日志
- C++ Primer 第五版 中文版 练习 12.26 个人code
- QStringLiteral
- Wireshark数据抓包分析——网络协议篇