这两天写一个项目遇到一个很怪异的现象,就是在url中汉字传值,如果是奇数个汉字则出现编码错误。先说下环境:
前台页面试gb2312编码,后台的filter是gbk,web server是nginx+resin,nginx用的是操作系统编码,编码是gbk
在输入http://www.我的域名.com/search/searchByName.action?query=%C1%AC%C1%AC%BF%B4 (1)
时后台不需要做处理,返回字符串正常
再输入http://www.我的域名.com/search/searchByName.action?query=连连看 (2)
时后台就显示乱码
我分别用chrome、firefox、ie8做了测试,结果虽然是乱码还各有特色
最初,在网上搜索解决方案,不过大部分都是一个来源,也就是让你在页面上先对汉字url encode一下然后再传值,但是这种情况不符合我的需求,我是要在浏览器中直接输入url,汉字传值;
解决方案一,在nginx中配置,将传递过来的url进行重写,让参数以重叠的方式向后台传送,比如原来是"query=你好啊",重写为"query = 你好啊你好啊",这样可以避免奇数个乱码问题,不过这有一个问题,就是和web server的耦合性太高,只要有汉字传值,就得重写nginx配置文件,不可取。
解决方案二,在后台发现,取出的parameter在utf8转换成gbk时,如果字符串.getbytes()是奇数个,最后一个byte会被吞掉,信息损失了,就没法转换回来了。很烦人,这时候在同事的启发下,发现request.getQueryString(),也可以得到参数,并且都是被转码过的,形如“query=%e7%be%8e%e5%a5%b3”,这个是没有被gbk过滤的,所以就通过处理这个字符串获取到了没有信息损失的编码。不过这时还有个问题,页面输入(1)(2)两个链接时后台要拿到相同的汉字,但是他们被编码后显示的编码值却不同,就是这个时候只要通过判断是否为utf8的url(此时有汉字传值),如下代码:
String parameterString = request.getQueryString();
if(parameterString!=null&&!parameterString.equals("")){
try {
CharTools ct = new CharTools();
if(ct.isUtf8Url(parameterString)){
parameterString = URLDecoder.decode(parameterString, "utf-8");
}else{
parameterString = URLDecoder.decode(parameterString, "gbk");
}
} catch (UnsupportedEncodingException e) {
logger.info("url解码出错", e);
}
String[] parameters = parameterString.split("&");
for(String str : parameters){
if(str.indexOf("query=")!=-1){
query = str.substring(str.indexOf("=")+1);
}
}
}
其中对应的CharTools中的方法为:
public boolean isUtf8Url(String text) {
text = text.toLowerCase();
int p = text.indexOf("%");
if (p != -1 && text.length() - p > 9) {
text = text.substring(p, p + 9);
}
return Utf8codeCheck(text);
}
private boolean Utf8codeCheck(String text) {
String sign = "";
if (text.startsWith("%e"))
for (int i = 0, p = 0; p != -1; i++) {
p = text.indexOf("%", p);
if (p != -1)
p++;
sign += p;
}
return sign.equals("147-1");
}
这样就可以将不同的编码传过来的url,进行不同的处置
next
这时候本以为完事大吉,没想又出了新的问题,即:在ie下汉字传值还是乱码,我通过后台检测发现,ie的request.getQueryString(),获取的是“query=????”,汉字没有以编码后的形式传送过来,然后再检查request.getParameter("query"),发现是正常的,这时候就可以通过对发送到后台的客户端就行判断,如下:
String agent = request.getHeader("User-Agent");
if(agent.indexOf("MSIE")!=-1){//ie情况比较特殊,不过此时在parameters中是正常的
query = request.getParameter("query");
}
这样在ie下拿到的汉字也就可以正常的显示了。
解决方案三:觉得最好的解决方案还是写个filter,现在项目比较紧张,以后要写,这样就可以忽略掉具体的请求,从整体层次进行解决问题。大致思路就是将方案二的解决办法浓缩到filter中。以后再写
还有一些感想,觉得chrome也不是那么完美,汉字传值不自动转码,给开发造成不少麻烦,还是firefox比较强大~
分享到:
相关推荐
为了解决奇数个中文字符URL传递乱码的问题,可以采用JavaScript来实现正确的编码处理。具体步骤如下: 1. **获取原始URL**:首先获取用户输入或系统生成的原始URL。 2. **编码处理**: - 使用`encodeURI()`函数...
可以解决中文乱码问题,共享给大家,解决UTF-8 转换 gb2312,直接放到Bin目录中并引用
idea、Eclipse等项目导入.java文件中文乱码完美解决方案:文件夹下所有GBK编码的.java一键转为utf-8,操作方式:将GBK2UTF8.jar文件考到需要转码项目目录,在当前位置运行控制台,输入命令java -jar GBK2UTF8.jar,...
经网友反映,还是有些中文会出现解码成乱码,而有些又可以,估计还是guessEncoding方法猜测编码出现了偏差,直接将guessEncoding方法写成返回UTF8就行了。 4.实现图片解码,即把条形码或二维码图片解码成其真实内容...
中文乱码问题在IT行业中是常见的...总之,理解和掌握字符编码的概念及其在Web开发中的应用是解决中文乱码问题的关键。保持编码一致性,正确配置服务器和过滤器,并注意浏览器的行为,可以有效地防止和解决这些问题。
经网友反映,还是有些中文会出现解码成乱码,而有些又可以,估计还是guessEncoding方法猜测编码出现了偏差,直接将guessEncoding方法写成返回UTF8就行了。 4.实现图片解码,即把条形码或二维码图片解码成其真实内容...
本文主要探讨了在使用Tomcat作为servlet容器,浏览器包括Firefox3.0和IE6的情况下,如何解决中文乱码问题,以及各种请求方式(GET、POST)下可能出现的乱码情况。 首先,确保所有页面的`charset`设置为`UTF-8`是...
0.jar包是已经把修改文件放进去后的结果。可以直接用 1.Utils类中有说明 2/表头乱码问题请参考http://download.csdn.net/detail/hongyuan19/4073652
《五年级苏教版数学解决问题的策略》着重探讨了如何运用转化策略来解决数学问题,这一策略对于将复杂问题简化,以及将不常见问题转换为常见问题至关重要。转化策略是数学学习中的核心思想之一,它涉及到多种数学概念...
这篇文档主要涵盖了小学五年级下学期数学中关于奇数与偶数的问题,涉及了奇偶数的性质及其在加减乘除运算中的规律。以下是基于文档内容总结的关键知识点: 1. **奇数与偶数的性质**: - **加法**:奇数+奇数=偶数...
这个特殊的算法针对的是魔方中奇数阶的排列问题,即3x3x3、5x5x5等具有奇数边长的魔方。 首先,让我们理解魔方的基本结构。魔方通常由26个小立方体组成,分为六个面,每个面上有9个可旋转的小色块。目标是将每个面...
针对“奇数求和”的问题,我们可以创建一个整数序列,然后遍历这个序列,检查每个数字是否为奇数,并将奇数累加。假设我们要从1到100的范围内求奇数和,可以这样编写代码: ```python sum_of_odds = 0 # 初始化奇数...
【描述】中提到,这个压缩包里的源代码是为了解决一个特定的问题——"奇数求和"。这通常意味着我们需要编写一个程序,接收一个数字序列(可能是数组或列表),然后计算并返回序列中所有奇数的和。源代码可能是用C++...
数据结构是计算机科学中的核心概念,它涉及到如何有效地组织和管理数据...通过解决奇数魔方阵问题,学生不仅可以学习到如何构建特定的数据结构,还能锻炼逻辑思维和问题解决技巧,这些都是计算机科学中不可或缺的技能。
小程序 奇数齿轮外径测量(学生必备)小程序 奇数齿轮外径测量(学生必备)小程序 奇数齿轮外径测量(学生必备)小程序 奇数齿轮外径测量(学生必备)小程序 奇数齿轮外径测量(学生必备)小程序 奇数齿轮外径测量...
标题中的“求奇数和偶数的和”指的是在编程领域中常见的数学问题,即计算一个数字序列中所有奇数和偶数的和。这个问题在初级编程教学中常见,通常用于教授基本的循环结构和条件判断。我们可以用多种编程语言来解决这...
离散数学是一门包含数学和计算机科学基础的学科,其在解决实际问题中的应用非常广泛。本文件提到的是关于离散数学的教科书《离散数学及其应用》第七版的辅导材料,该书由肯尼斯·H·罗森编著。在这些辅导材料中,...
解答中可能会详细解释每个步骤,包括如何运用逻辑推理、如何构建和分析图、如何进行组合计数、如何解决数论问题等。这些详细的解答对于自主学习和复习非常有帮助,因为它们提供了清晰的思路和解决问题的方法。同时,...
总的来说,这个问题展示了如何利用Java的循环结构和条件语句解决实际问题。同时,这也是一种很好的方式来练习基本的编程技能,例如控制流和逻辑判断。在学习过程中,掌握这些基础知识对于成为一名优秀的Java程序员至...
在IT领域,顺序表是一种常见的数据结构,它按照元素的线性顺序存储数据。这个程序的重点在于奇数的查找和测试,这对于理解...通过这个程序,我们可以深入理解如何在实际项目中运用这些知识,并提高问题解决和编程能力。