`
jimmy9495
  • 浏览: 301193 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

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

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

解决方法:通过requset.getQueryString() 来获取到 %D6%D0%B9%FA 再urldecode 下就得到了 正确的中文了
此类,就是基于通过自己解析http的queryString和postdata来处理乱码问题的
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());
		}
	}
}



然后action或jsp中使用如下代码获取到的就是正常的中文了


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


参见:http://bbs.csdn.net/topics/390360298?page=1#post-393608658
分享到:
评论

相关推荐

    解决Tomcat中文乱码

    Tomcat默认使用的字符集是ISO-8859-1,而大多数中文网页和文件采用的是GBK或UTF-8编码。当Tomcat处理这些中文内容时,如果没有正确地转换编码,就会出现乱码问题。 #### 原因分析 1. **默认字符集问题**:Tomcat...

    tomcat值乱码解决

    一般我们所装的linux服务器,是中文版的,所以系统环境的编码是gbk,然而我们项目的编码是UTF-8,这就必须在tomcat的server.xml文件中修改,在两个地方添加 URIEncoding="UTF-8",具体代码如下:

    apache-tomcat-8.0.33中文自动解决GBK乱码问题

    而该工具可以自动解决UTF-8和GBK乱码的问题。 使用教程: 直接替换原先项目的Tomcat,将JavaWeb项目(Servlet、SSH、SSM框架的项目)直接部署到该Tomcat8中即可,无需做其他的额外的操作。 运行教程: 可以通过...

    android客户端向服务器提交请求的中文乱码问题

    因此,当它尝试以UTF-8解码接收到的请求参数时,如果数据实际使用了ISO-8859-1编码,中文字符就会显示为乱码。 为了解决这个问题,可以在客户端对中文参数进行URL编码,然后在服务器端进行解码。在Android客户端,...

    中文乱码解决方案.pdf

    如果我们将其设置为UTF-8,那么Tomcat容器将使用UTF-8编码来解析请求页面。 五、过滤器的使用 过滤器可以用来解决请求页面的字符编码问题。我们可以在过滤器中设置request.setCharacterEncoding("utf-8"),以将...

    tomcat显示出现中文乱码问题.docx

    在使用Apache Tomcat服务器的过程中,有时会遇到中文乱码的问题,这主要表现为在日志输出、控制台打印或者Web应用中的请求参数、响应内容显示不正常,出现问号或者其他非中文字符。这个问题通常是由于字符编码设置不...

    JSP中 ajax的get请求的中文乱码问题的解决方法.pdf

    这样,当你在JSP中生成包含中文字符的URL时,它们会被正确编码为UTF-8格式。 5. **Ajax请求**: 如果你在JavaScript中使用Ajax发送GET请求,确保使用`encodeURIComponent()`函数对包含中文的参数进行编码。这将...

    解决tomcat中文乱码问题.doc

    例如,默认编码为ISO-8859-1,而中文字符通常使用GBK或UTF-8等编码。 **解决方案**:在JSP页面的`@page`指令中指定合适的字符集。示例代码如下: ```jsp ;charset=GBK" %&gt; ``` 通过这种方式,可以确保JSP页面在...

    IDEA中Tomcat在控制台乱码问题及IDEA编码设置UTF-8的方法

    2.tomcat日志编码:cmd内 “cd /d tomcat根目录” “bin\catalina.bat run” 运行,”chcp65001″切换cmd为utf8,”chcp 936″切换cmd为gbk,确定tomcat日志编码,一般因为tomcat/conf/logging.properties ...

    url中文乱码处理大全.docx

    当在Tomcat服务器上处理包含中文的URL时,如果直接通过`request.getParameter()`获取参数,可能会因为默认的编码格式ISO-8859-1不支持中文,导致中文参数变成乱码。为了解决这个问题,开发者通常会采用以下步骤: 1...

    JSP对URL链接中的中文乱码处理方法总结.docx

    JSP 对 URL 链接中的中文乱码处理方法总结是指在 JSP 应用程序中,如何正确地处理 URL 链接中的中文字符编码问题。这个问题的出现是由于不同浏览器和服务器的默认编码方式不同所造成的。 IE浏览器缺省对 URL 后面的...

    servlet与jsp中文乱码处理

    - **UTF-8**:最常用的Unicode编码方式,它以字节为单位进行编码,对于中文字符通常需要3个或4个字节。 - **GBK**:中国的国标编码,主要用于简体中文,每个字符占2字节。 2. **Servlet中的中文乱码处理** - **...

    JSP中文乱码处理JSP中文乱码处理

    【JSP中文乱码处理详解】 在Web开发中,JSP中文乱码是一个常见的问题,主要涉及页面显示、表单提交以及数据库操作等环节。理解并掌握这些环节的编码处理至关重要,以确保数据的准确性和用户体验。 1. **JSP文件的...

    中文乱码处理方案.docx

    如果URIEncoding设置为UTF-8,服务器能正确解码并处理中文参数,不会出现乱码。但如果URIEncoding设置为其他编码,如ISO-8859-1,就会发生转码错误,导致乱码。 2. 表单POST提交:对于POST请求,可以通过在Filter中...

    Servlet 中文乱码问题

    POST请求的乱码可以通过设置Servlet容器的请求编码参数解决,例如在Tomcat中配置`URIEncoding="UTF-8"`。GET请求的乱码处理通常在Servlet代码中完成,接收参数前需先设置请求的编码,如`request.setCharacter...

    EL中文显示乱码的解决办法

    在使用EL(Expression Language)表达式处理中文字符时,可能会遇到中文显示乱码的问题,这通常是由于字符编码不一致导致的。以下是一些详细的解决步骤和相关知识点: 1. **理解字符编码**: - 字符编码是用来表示...

    tomcat服务器如何配置字符集为utf-8彻底解决中文乱码的问题详解

    这样配置后,Tomcat在解析URL时将使用UTF-8编码,对于GET请求,中文参数就不会出现乱码。然而,对于POST请求,还需要额外的处理。通常,我们可以使用`request.setCharacterEncoding("UTF-8")`方法在Servlet中设置...

    java开发乱码问题处理大全

    对于POST请求,可以通过在Servlet中使用`SetCharacterEncodingFilter`来统一设置字符编码为UTF-8,确保所有POST请求的数据都能正确解析。值得注意的是,此过滤器仅对POST方法有效,对于GET方法则不起作用,因此在...

    程序中关于乱码的处理

    编码机制是导致乱码的核心原因,中文字符通常使用GBK或GB2312等编码,而英文字符则普遍采用ASCII或Unicode。如果不进行正确的编码转换,就可能导致在读取、存储或传输数据时出现乱码。 Java程序员经常遇到的乱码...

Global site tag (gtag.js) - Google Analytics