zoukankan      html  css  js  c++  java
  • 在变形过程中遇到的问题

    有时。什么时候开发。我们不能要求客户更改字符集,最近遇到一个中国的人品问题很让人蛋疼。在IE而测试在Firefox,后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-9u4e00-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(" 查询“西”,响应内容:" + EntityUtils.toString(entity, "gbk")); } } catch (Exception e) { e.printStackTrace(); } finally { try { // 关闭或释放资源 httpClient.close(); } catch (IOException e) { e.printStackTrace(); } }







    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    CF1168B Good Triple 性质分析
    bzoj 4994: [Usaco2017 Feb]Why Did the Cow Cross the Road III 树状数组_排序
    BZOJ 3940: [Usaco2015 Feb]Censoring AC自动机+栈
    BZOJ 1691 [Usaco2007 Dec]挑剔的美食家 multiset+排序+贪心
    BZOJ 1725: [Usaco2006 Nov]Corn Fields牧场的安排 状压动归
    BZOJ 1726: [Usaco2006 Nov]Roadblocks第二短路 Dijkstra
    BZOJ 1666: [Usaco2006 Oct]Another Cow Number Game 奶牛的数字游戏 幼儿园测试题
    BZOJ 5508: [Tjoi2019]甲苯先生的字符串 矩阵乘法_思维
    BZOJ 1602: [Usaco2008 Oct]牧场行走 倍增裸题
    描述符get/set/delete,init/new/call,元类
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4754083.html
Copyright © 2011-2022 走看看