pager-taglib分页中文乱码原理解析

关于使用pager-taglib分页前端传递中文参数乱码问题的解决方案

1.重现问题

在web项目中有时会用到pager-taglib来作为分页的标签,如上图红色框标识所示,当我们需要把页面参数保持的时候我们会在<pg:param />标签中把参数进行传递。

如果你的页面编码为gb2312那这样写是没有问题的,但是如果你的页面编码是utf-8的话那就会出现乱码问题。我尝试了很多方法,编码过滤器,编码拦截器(struts2),传递

参数的时候进行编码然后后台进行解码,还有WEB(如TomCat等)应用服务器编码。还是觉得这些方法没有从根本上解决问题。既然是用pager-taglib标签进行分页,那我们就

去看看pager-taglib里面关于字符集编码的处理。

2.pager-taglib字符集处理源码

a.首先我们要准备一个pager-taglib-2.0的war包

b.然后我们把它解压

在WEB-INF下面的lib包下面有两个jar包

c.pager-src.jar这就是pager-taglib的源码包,我们打开它找到final void addParams(String name, Stringvalue)这个方法

上图标红的几行代码很容易就能看出URLEncoder.encode(value)方法就是在对传递的参数进行字符集编码处理,那具体是怎么处理呢?

我们继续跟进去看源码.

d.URLEncoder源码

找到这个方法后我们发现它已经被标上了@Deprecated的注解,这是个什么意思,由于英文不好,咱打开翻译工具查一下

好吧,已经是不推荐的方法了,但是没关系,这个方法它调用了另外一个encode(s, dfltEncName)方法,那咱继续跟进去看

一大段源码,看关键地方

if(enc == null){

throw new NullPointerException("charsetName");

}

我不是技术大牛,但是一看到charstName这个关键字,咱还是知道肯定跟字符集有关,那enc这个参数是什么意思呢?

往上看,这个就是那个过时的encode(s, dfltEncname)传递过来的参数dfltEncName不就是是defaultEncName的缩写?

什么意思呢?默认的环境名称?不清楚继续找看哪里有对这个变量的操作:

然后在这个类的staic静态块里面找到了

到此咱还是不明白到底是个怎么处理过程,不要急,继续找这个GetPropertyAction("file.encoding")的麻烦,但是看到这个方法是不是很眼熟?

咱要获得咱当前操作系统的字符集编码不是都这么写吗?

然后咱再进GetPropertyAction这个类的源码看看

好吧,看到这里想必大家都明白了,原来pager-taglib默认最字符集编码的处理就是使用你当前操作系统的编码方式,

就算你页面设置的其他的字符集编码,它也不会管你的,它还是取得当前系统的字符集编码方式然后处理,突然觉得

编写这个pager-taglib的人好JB蠢。 一般如果咱使用的是window的操作系统,那么编码都是GBK,到此咱就明白了吧。

因为你的页面用的是utf-8编码,而你传递中文参数的时候pager-taglib又默认用GBK编码进行的处理,理所当然就会出现乱码了。

那么解决方案呢?

咱再回到PagerTag类里面,就在encode()方法下面一点,咱仔细一看有这么一行代码

String[] values = pageContext.getRequest().getParameterValues(name);

这不是牛B的pageContext对象吗?那咱是不是可以从这个上下文中拿到页面你设置的编码方式呢?

答案是肯定的,所以咱只需做如下修改

\

3.解决问题

好了,接下来需要做的事很简单了,将你修改过后的东西整个打成jar包然后上传的项目就可以解决中文乱码问题了,你再也不用encode()过去,decode()回来了.

a.首先在你的IDE中新建一个名为pager-taglib的项目,然后把官方的pager-src下面的com包下面的java类和META-IF导入

找到PagerTag.java类进行上面解决方案中的修改,然后用你用的IDE导出jar包,我用的是myeclipse

File --> Export -->java --> JAR file

4.总结

刚遇到这个问题的时候我也去网上找解决办法。关于最后进行修改编码的这部分,网上有相关的文章,但是几乎所有的都只是说pager-talib用的是你系统

默认的编码方式,需要改成你页面的编码方式。但是个人不喜欢这种知其然不知其所以然的方式,所以自己跟着源码进去找到了pager-taglib到底是怎么用

系统默认的编码方式的,最后想要取得页面编码方式的时候又看到了pageContext这个对象,又增强了自己对pageContext这个对象的认识。因为网上有很

多修改编码方式是直接写上去的就像这样

name = java.net.URLEncoder.encode(name, "utf-8");
           value = java.net.URLEncoder.encode(value, "utf-8");

个人觉得这是很愚蠢的办法,因为导致中文乱码的原因并不是你没有使用utf-8的编码,而是因为页面和pager-taglib处理中文乱码的编码不一致导致的,

虽然现在基本上对中文编码的处理就utf-8和gbk但是我假如有很多对于中文编码的处理,当我页面用的另外一种其他的编码的时候你还是在这里写死utf-8

岂不是很2B?所以这里还是推荐

name = java.net.URLEncoder.encode(name, pageContext.getResponse().getCharacterEncoding());

value = java.net.URLEncoder.encode(values[i], pageContext.getResponse().getCharacterEncoding());

这种方式,因为我们需要做的只是取到页面的编码方式和pager-taglib保持一致而已.

当然,可能还有一些其它的更好的解决方案,或者其它的问题所导致的乱码问题,这里仅推荐个人觉得适合的对这个问题的解决方案.

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-05 16:39:38

pager-taglib分页中文乱码原理解析的相关文章

Request 接收参数乱码原理解析二:浏览器端编码原理

上一篇<Request 接收参数乱码原理解析一:服务器端解码原理>,分析了服务器端解码的过程,那么浏览器是根据什么编码的呢? 1. 浏览器解码 浏览器根据服务器页面响应Header中的“Content-Type: text/html; charset=gb2312”解码.修改web.config中“responseEncoding=utf-8”,发现服务器页面响应Header变成了“Content-Type: text/html; charset=utf8”. <system.web&g

Request 接收参数乱码原理解析

起因: 今天早上被同事问了一个问题:说接收到的参数是乱码,让我帮着解决一下. 实际情景: 同事负责的平台是Ext.js框架搭建的,web.config配置文件里配置了全局为“GB2312”编码: <globalization requestEncoding="gb2312" responseEncoding="gb2312" fileEncoding="gb2312" culture="zh-CN"/> 当前台提交

Request 接收参数乱码原理解析一:服务器端解码原理

“Server.UrlDecode(Server.UrlEncode("北京")) == “北京””,先用UrlEncode编码然后用UrlDecode解码,这条语句永远为true吗?答案是否定的,结果可能与很多人预想的不大一样.本文主要分析这一问题出现的原理,研究下Server.UrlEncode(),Server.UrlDecode(),Request["xxx"]三个函数与编码方式的关系. 1. 问题出现的情景 网站采用了GB2312编码,在Web.confi

json_encode返回的中文乱码,解析不出

json_encode返回的中文乱码,解析不出,json_encode里面加个参数就行了 json_encode($data,JSON_UNESCAPED_UNICODE); 原文地址:https://www.cnblogs.com/yehuisir/p/12446009.html

[转] Request 接收参数乱码原理解析

起因: 今天早上被同事问了一个问题:说接收到的参数是乱码,让我帮着解决一下. 实际情景: 同事负责的平台是Ext.js框架搭建的,web.config配置文件里配置了全局为“GB2312”编码: <globalization requestEncoding="gb2312" responseEncoding="gb2312" fileEncoding="gb2312" culture="zh-CN"/> 当前台提交

黑马day03 文件下载&amp;中文乱码原理以及url编码

在请求码和响应码中的数据只能是英文状态的即iso8859-1,不可能是中文的,因此,如果文件的名字是中文的需要进行url编码 //这句话是告诉浏览器以下载的方式,被发送的数据要进行url编码,对文件的名字进行url编码-->编码原理: //将美女转化为utf-8的形式然后转化为16进制,前面加% utf-8一个汉字三个字节下面的只是假设 //美 1100 1001  1110 0110   1000 0001-->%2a %3d %4e //女 1110 1011  1111 0110   1

黑马day06 jsp之中文乱码&amp;原理&amp;解决方案

我们可以发现我们的工具eclipse或者myeclipse有很强的功能,我们很少见到jsp页面的乱码问题,这是为什么呢?这是因为eclipse很智能,会根据pageEncoding="UTF-8"这个page指令,保存的时候就会提前预知服务器要使用utf-8进行解码,因此保存的时候会根据pageEncoding="UTF-8"智能的为我们写的jsp保存为utf-8格式.但是当我们使用记事本或者其他文本工具进行开发,就会很容易造成乱码,这里我将详细的分析乱码的原因,以

Django 分页查询并返回jsons数据,中文乱码解决方法

一.引子 Django 分页查询并返回 json ,需要将返回的 queryset 序列化, demo 如下: # coding=UTF-8 import os from django.core import serializers from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage from django.shortcuts import render from django.http import

hive中文乱码-解析json

--最近在做手机型号维度分析统计中,手机型号出现中文乱码的现象,查找的最终的原因的,在json解析的过程中,出现乱码,定位是分隔符的问题 '||' 解决思路:用split函数的(||)切割json和ip,最终没有乱码的现象,但是问题解决了,不知是什么原因,估计是其中类的原因 select phone_mode_name,phone_brand_name from intdata.kesheng_sdk_device where phone_mode_name like '%?%' or phon