关于乱码处理遇到的问题

有时候,做开发时,我们无法要求客户对字符集的更改,最近遇到一个中文字符问题挺让人蛋疼的,在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();
			}
		}
时间: 2024-08-05 03:41:15

关于乱码处理遇到的问题的相关文章

Python cmd 中文显示乱码

方法一:# -*- coding:utf-8 -*- content = "我是中文" content_unicode = content.decode("utf-8") content_gbk = content_unicode.encode("gbk") print content_gbk 方法二: 解决非常简单 先引入import sys 再加一句:type=sys.getfilesystemencoding() 然后在输出乱码的数据的时候

Linux环境下MySQL数据库用SQL语句插入中文显示 “问号或者乱码 ” 问题解决!

问题: 在普通用户权限下执行 mysql -u root -p进入mysql数据库,中间步骤省略,插入数据:insert into 库名(属性)values('汉字'); 会出现如下提示:  Query OK, 1 row affected, 1 warning (0.00 sec)    表明出现错误,没有插入成功,然后执行select * from 表名   就会出现如下的问题:显示的表中出现乱码或者问号. 如图: 解决方案: 首先重新打开一个终端窗口(方便操作),进入root用户模式 执行

Activiti Linux部署流程图出现乱码

前段时间使用Activiti在本机以及window环境下测试发现流程图正常显示,在linux下汉字变成了小方块. 经网上查找资料: 发现自己的京东云未安装中文字体,由于本人系统activiti配置文件设置的"宋体",因此需在window系统中找到宋体字体复制到linux系统中进行安装. 1,进入C:\Windows\Fonts,找到"宋体 常规"文件simsun.ttc 2,进入cd /usr/java/jdk1.7.0_79/jre/lib/fonts,新建fal

centos6.7下安装mysql5.6.22同时解决中文乱码问题

1.下载 http://dev.mysql.com/downloads/mysql/ 或者使用wget下载: wget http://dev.mysql.com/get/Downloads/MySQL-5.6/MySQL-5.6.22-1.el6.i686.rpm-bundle.tar 2.安装 2.1.  检测是否已经安装了mysql rpm -qa | grep mysql 如果已经安装了,将其卸载,如: rpm -e --nodeps  mysql-libs-5.1.71-1.el6.x8

页面与后台传递中文乱码问题(java乱码)

1.前台中文传递到后台乱码. 前台不须要处理, 系统一般都会默认把中文转化为ISO-8859-1类型. 仅仅需在后台接受数据是处理 Str为前台传过来的中文字符串: String inputer = new String( Str.getBytes("ISO-8859-1") , "GB2312"); 2.前台不仅包括中文.并且包括特殊字符,假设仅仅在后台转码,比較困难.採用前台转码,那么就採用后台解码的方式处理 var theid = encodeURI(enco

java web 程序乱码问题

1.问题:今日观别人代码,发现前端输入正确,保存后出现乱码.数据库中也为乱码. 输入: 输入完成后,列表页面乱码如下: 数据库乱码如下: 分析问题:??? 解决问题:???

XShell连接CentOS 7.2显示中文乱码问题的解决方法

背景 使用U盘往Windows主机.Linux主机传文件还是经常的事,但有时候文件名有中文, 传到Linux机器会有乱码,选择起来也很麻烦,最近刚好遇到,写下解决方法. 环境 Linux [[email protected] ~]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) [[email protected]-base ~]# echo $LANG en_US.UTF-8 [[email protected]-ba

解决MVC 中httpstatuscoderesult 通过StatusDescription 返回中文乱码

c#中httpstatuscoderesult语法如下: public HttpStatusCodeResult( HttpStatusCode statusCode, string statusDescription ) 在Action中通过 return new HttpStatusCodeResult(HttpStatusCode.BadRequest,"我是中文字符串") 在前端返回的是乱码. 原因: 根据 http 协议,StatusDescription 是写在 http

[oracle]解决centos 7下oracle的中文乱码问题

首先在形成中文乱码的原因是由于字符集不统一导致的,不同的字符集在转换的过程中必然要出现乱码,当然不排除可以转换.所以要解决中文乱码问题,思路是将输入.存储.显示等流程中涉及到字符集都统一为一种,对于oracle首先必须满足的先决条件是要服务端和客户段的字符集统一,若还不能解决问题,同时还要将系统的字符集与之统一,甚至导入或输入数据所使用的字符集统一. 看了网上的一些资料后,都说修改服务器的字符集风险比较大,确实,测试开发用还好说,假若是上线项目的服务器,那修改服务器字符集所带来的后果是不堪的,废

zabbix开启web界面中文支持(中文乱码问题)

1.开启web界面中文支持 #vi /var/www/zabbix/include/locales.inc.php 将这一行修改为'zh_CN' => array('name' => _('Chinese(zh_CN)'),        'display' => true) 2.中文字体乱码问题 替换 /var/www/zabbix/fonts/DejaVuSans.ttf即可