java 特殊字符 乱码_【Java】关于乱码处理遇到的问题

本文探讨了解决不同浏览器上出现的中文乱码问题的方法。通过使用正则表达式判断字符编码,并介绍了使用URLEncoder和URLDecoder类进行中文参数编码和解码的有效方案。

bc7fdfc03a181785f939cc7c3cabcadc.gif

有时候,做开发时,我们无法要求客户对字符集的更改,最近遇到一个中文字符问题挺让人蛋疼的,在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对乱码的验证,后来经过考虑,尝试使用正则判断,排除乱码产生的特殊字符,虽说不是很严禁,个人觉得对付一般的乱码问题还是可以应付的。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();

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值