tomcat为utf8编码,解析gbk编码的URL请求,中文乱码处理

[color=red] 项目中tomcat设置为utf8解码,当对外的url接口(如ReceiveAction)接收到gbk编码请求时候会自动被tomcat解码为utf8,
此时中文直接request.getParameter("content")出来就是乱码,无法直接转换回gbk,怎么转换都是乱码。

解决方法:通过requset.getQueryString() 来获取到 %D6%D0%B9%FA 再urldecode 下就得到了 正确的中文了
此类,就是基于通过自己解析http的queryString和postdata来处理乱码问题的
[/color]

import java.io.IOException;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.StringTokenizer;

import javax.servlet.http.HttpServletRequest;

/**
* 项目中tomcat设置为utf8解码,当对外的url接口(如ReceiveAction)接收到gbk编码请求时候会自动被tomcat解码为utf8,
* 此时中文直接request.getParameter("content")出来就是乱码,无法直接转换回gbk,怎么转换都是乱码。
*
* 解决方法:通过requset.getQueryString() 来获取到 %D6%D0%B9%FA 再urldecode 下就得到了 正确的中文了
* 此类,就是基于通过自己解析http的queryString和postdata来处理乱码问题的
*
*/
public class HttpRequestReader {

Hashtable pairs = new Hashtable();

/**
* RawParameterReader constructor comment.
*/
public HttpRequestReader(HttpServletRequest request, String encoding)
throws IOException {
super();
parse(request.getQueryString(), encoding);
parse(request.getReader().readLine(), encoding);
}

public static String decode(String s, String encoding) throws Exception {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
switch (c) {
case '+':
sb.append(' ');
break;
case '%':
try {
sb.append((char) Integer.parseInt(
s.substring(i + 1, i + 3), 16));
} catch (NumberFormatException e) {
throw new IllegalArgumentException();
}
i += 2;
break;
default:
sb.append(c);
break;
}
}
// Undo conversion to external encoding
String result = sb.toString();
byte[] inputBytes = result.getBytes("8859_1");
return new String(inputBytes, encoding);
}

/**
* Insert the method's description here. Creation date: (2001-2-4 17:30:59)
*
* @return java.lang.String
* @param name
* java.lang.String
*/
public String getParameter(String name) {
if (pairs == null || !pairs.containsKey(name))
return null;
return (String) (((ArrayList) pairs.get(name)).get(0));
}

/**
* Insert the method's description here. Creation date: (2001-2-4 17:28:17)
*
* @return java.util.Enumeration
*/
public Enumeration getParameterNames() {
if (pairs == null)
return null;
return pairs.keys();
}

/**
* Insert the method's description here. Creation date: (2001-2-4 17:33:40)
*
* @return java.lang.String[]
* @param name
* java.lang.String
*/
public String[] getParameterValues(String name) {
if (pairs == null || !pairs.containsKey(name))
return null;
ArrayList al = (ArrayList) pairs.get(name);
String[] values = new String[al.size()];
for (int i = 0; i < values.length; i++)
values[i] = (String) al.get(i);
return values;
}

/**
* Insert the method's description here. Creation date: (2001-2-4 20:34:37)
*
* @param urlenc
* java.lang.String
*/
private void parse(String urlenc, String encoding)
throws java.io.IOException {
if (urlenc == null)
return;
StringTokenizer tok = new StringTokenizer(urlenc, "&");
try {
while (tok.hasMoreTokens()) {
String aPair = tok.nextToken();
int pos = aPair.indexOf("=");
String name = null;
String value = null;
if (pos != -1) {
name = decode(aPair.substring(0, pos), encoding);
value = decode(aPair.substring(pos + 1), encoding);
} else {
name = aPair;
value = "";
}
if (pairs.containsKey(name)) {
ArrayList values = (ArrayList) pairs.get(name);
values.add(value);
} else {
ArrayList values = new ArrayList();
values.add(value);
pairs.put(name, values);
}
}
} catch (Exception e) {
throw new java.io.IOException(e.getMessage());
}
}
}



[color=red]然后action或jsp中使用如下代码获取到的就是正常的中文了[/color]



HttpRequestReader paramReader = new HttpRequestReader(request, "gbk");
String name = paramReader.getParameter("name");
System.out.println(name);


参见:[url]http://bbs.csdn.net/topics/390360298?page=1#post-393608658[/url]
相关资源:Leslie人口预测代码
  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

打赏
文章很值,打赏犒劳作者一下
相关推荐
限时福利限时福利,15000+程序员的选择! 购课后添加学习助手(微信号:csdn590),按提示消息领取编程大礼包!并获取讲师答疑服务! 套餐中一共包含5门程序员必学的数学课程(共47讲) 课程1:《零基础入门微积分》 课程2:《数理统计与概率论》 课程3:《代码学习线性代数》 课程4:《数据处理的最优化》 课程5:《马尔可夫随机过程》 哪些人适合学习这门课程? 1)大学生,平时只学习了数学理论,并未接触如何应用数学解决编程问题; 2)对算法、数据结构掌握程度薄弱的人,数学可以让你更好的理解算法、数据结构原理及应用; 3)看不懂大牛代码设计思想的人,因为所有的程序设计底层逻辑都是数学; 4)想学习新技术,如:人工智能、机器学习、深度学习等,这门课程是你的必修课程; 5)想修炼更好的编程内功,在遇到问题时可以灵活的应用数学思维解决问题。 在这门「专为程序员设计的数学课」系列课中,我们保证你能收获到这些: ①价值300元编程课程大礼包 ②应用数学优化代码的实操方法 ③数学理论在编程实战中的应用 ④程序员必学的5大数学知识 ⑤人工智能领域必修数学课 备注:此课程只讲程序员所需要的数学,即使你数学基础薄弱,也能听懂,只需要初中的数学知识就足矣。 如何听课? 1、登录CSDN学院 APP 在我的课程中进行学习; 2、登录CSDN学院官网。 购课后如何领取免费赠送的编程大礼包和加入答疑群? 购课后,添加助教微信: csdn590,按提示领取编程大礼包,或观看付费视频的第一节内容扫码进群答疑交流!
后台技术选型: <ul style="color:#2F2F2F;"> <li> JDK8 </li> <li> MySQL </li> <li> Spring-boot </li> <li> Spring-data-jpa </li> <li> Lombok </li> <li> Freemarker </li> <li> Bootstrap </li> <li> Websocket </li> </ul> 小程序端技术选型 <ul style="color:#2F2F2F;"> <li> 微信小程序 </li> </ul> <div style="text-align:center;color:#2F2F2F;"> <div style="background-color:transparent;"> <div> </div> <div> <img alt="" src="https://upload-images.jianshu.io/upload_images/6273713-928017278f465cbd.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1000/format/webp" /> </div> </div> <div style="font-size:14px;color:#969696;"> <br /> </div> </div> 小程序端 <div style="text-align:center;color:#2F2F2F;"> <div style="background-color:transparent;"> <div> </div> <div> <img alt="" src="https://upload-images.jianshu.io/upload_images/6273713-8d6c2b81701d32cd.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1000/format/webp" /> </div> </div> <div style="font-size:14px;color:#969696;"> <br /> </div> </div> <ul style="color:#2F2F2F;"> <li> 扫码点餐 </li> <li> 菜品分类显示 </li> <li> 模拟支付 </li> <li> 评论系统 </li> <li> 购物车 </li> </ul> <p> <span><img alt="" src="https://img-bss.csdn.net/201907270119553529.png" /><br /> </span> </p> <p> <span><img alt="" src="https://img-bss.csdn.net/201907270120098756.png" /><br /> </span> </p> <p> <span><img alt="" src="https://img-bss.csdn.net/201907270120405331.png" /><br /> </span> </p> <p> <span><img alt="" src="https://img-bss.csdn.net/201907270120538298.png" /><img alt="" src="https://img-bss.csdn.net/201907270121012487.png" /><br /> </span> </p>
<p> <span style="color:#494949;font-size:14px;"><br /> </span> </p> <p> <span style="color:#494949;font-size:14px;">为什么人人都要学Git?</span><span style="color:#494949;font-size:14px;">Git的由来可不简单,最初是由Linux之父-林纳斯.托瓦兹为了更好管理Linux内核代码而编写的,</span><span style="color:#494949;font-size:14px;">Git用于版本控制,可以说是开发日常必备,很好的解决了代码合并的问题,经得起频繁多人修改的考验!</span> </p> <p class="ql-long-24357476" style="font-size:11pt;color:#494949;"> <span style="font-size:14.6667px;"><br /> </span> </p> <p class="ql-long-24357476" style="font-size:11pt;color:#494949;"> <span style="font-size:14px;">庞大的项目从来不是一个程序员可以搞定的,多人合作时代码版本管理显的尤为重要,千辛万苦改的Bug代码一合并没了怎么办?</span><span style="font-size:14px;">Git如此重要,相信作为程序员的你一定需要学习,2小时从根本理解Git!</span> </p> <p class="ql-long-24357476" style="font-size:11pt;color:#494949;"> <span style="font-size:14px;"><br /> </span> </p> <p class="ql-long-24357476" style="color:#494949;font-size:11pt;"> <span style="font-size:14px;color:#E53333;">学完即可轻松应对工作中 99% 以上的 日常代码管理 使用场景,实用性99.9999%!</span> </p> <p> <br /> </p> <p class="ql-long-24357476" style="font-size:11pt;color:#494949;"> <span class="ql-author-24357476"> </span> </p> <p class="ql-long-24357476" style="font-size:11pt;color:#494949;"> <span style="font-size:14px;">这门课程,绝对不会让你觉得亏!</span> </p> <p class="ql-long-24357476" style="font-size:11pt;color:#494949;"> <br /> </p> <p class="ql-long-24357476" style="font-size:11pt;color:#494949;"> <span style="font-size:14px;">Git基本用法+Git高级用法+Git原理+课程教辅</span> </p> <p style="font-size:11pt;color:#494949;"> <span style="font-size:14px;"> </span> </p> <p class="ql-long-24357476" style="font-size:11pt;color:#494949;"> <span style="font-size:14px;">本课程实用性极强,边学边用!<span style="background-color:#FF9900;">零基础</span>也能轻松入门~</span> </p> <p class="ql-long-24357476" style="font-size:11pt;color:#494949;"> <span style="font-size:14px;"><br /> </span> </p> <p class="ql-long-24357476" style="font-size:11pt;color:#494949;"> <span style="font-size:14px;color:#E53333;">在这门课中,我们保证你能收获到这些</span> </p> <p class="ql-long-24357476" style="font-size:11pt;color:#494949;"> <span style="font-size:14px;">1)Git最佳实践</span> </p> <p class="ql-long-24357476" style="font-size:11pt;color:#494949;"> <span style="font-size:14px;">2)版本管理</span> </p> <p class="ql-long-24357476" style="font-size:11pt;color:#494949;"> <span style="font-size:14px;">3)分支管理</span> </p> <p class="ql-long-24357476" style="font-size:11pt;color:#494949;"> <span style="font-size:14px;">4)标签管理</span> </p> <p class="ql-long-24357476" style="font-size:11pt;color:#494949;"> <span style="font-size:14px;">5)解决冲突</span> </p> <p class="ql-long-24357476" style="font-size:11pt;color:#494949;"> <span style="font-size:14px;">6)Git信息存储原理</span> </p> <p class="ql-long-24357476" style="font-size:11pt;color:#494949;"> <span style="font-size:14px;">7)深入理解Git三大分区</span> </p> <p class="ql-long-24357476" style="font-size:11pt;color:#494949;"> <span style="font-size:14px;"><br /> </span> </p> <p class="ql-long-24357476" style="color:#494949;font-size:11pt;"> <br /> </p> <p class="ql-long-24357476" style="color:#494949;font-size:11pt;"> <br /> </p> <p class="ql-long-24357476" style="color:#494949;font-size:11pt;"> <br /> </p> <p class="ql-long-24357476" style="color:#494949;font-size:11pt;"> --------------------------------------------------------------- </p>
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页

打赏

jimmy9495

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者