最代码官方的gravatar头像
最代码官方 2015-04-24 16:04:22

java web开发中对http请求参数值出现乱码的终极解决方案

之前分享过一篇文章spring mvc自定义过滤器filter实现对请求参数编解码的代码分享,发现如果通过curl模拟agent请求的话还是会出现乱码的问题,又或者通过safari请求接口时同样也会出现乱码问题。

所以百度了下发现还真有乱码的判断代码:

package com.zuidaima.util;

import java.io.UnsupportedEncodingException;

public class 是否为中文检测 {

	/**  
	 *  用getBytes(encoding):返回字符串的一个byte数组  
	 *  当b[0]为  63时,应该是转码错误  
	 *  A、不乱码的汉字字符串:  
	 *  1、encoding用UTF8时,每byte是负数;  
	 *  2、encoding用ISO8859_1时,b[i]全是63。  
	 *  B、乱码的汉字字符串:  
	 *  1、encoding用ISO8859_1时,每byte也是负数;  
	 *  2、encoding用UTF8时,b[i]大部分是63。  
	 *  C、英文字符串  
	 *  1、encoding用ISO8859_1和UTF8时,每byte都大于0;  
	 *  总结:给定一个字符串,用getBytes("iso8859_1")  
	 *  1、如果b[i]有63,不用转码;  A-2  
	 *  2、如果b[i]全大于0,那么为英文字符串,不用转码;  B-1  
	 *  3、如果b[i]有小于0的,那么已经乱码,要转码。  C-1  
	 */ 
	private static String toUTF8(String str) {
		if (str == null)
			return null;
		String retStr = str;
		byte b[];
		try {
			b = str.getBytes("ISO8859_1");
			for (int i = 0; i < b.length; i++) {
				byte b1 = b[i];
				if (b1 == 63)
					break; // 1
				else if (b1 > 0)
					continue;// 2
				else if (b1 < 0) { // 不可能为0,0为字符串结束符
					// 小于0乱码
					retStr = new String(b, "UTF8");
					break;
				}
			}
		} catch (UnsupportedEncodingException e) {
			// e.printStackTrace();
		}
		return retStr;
	}

	public static void main(String[] args) throws UnsupportedEncodingException {
		byte[] a = new byte[] { -61, -90, -62, -100, -62, -128, -61, -92, -62,
				-69, -62, -93, -61, -89, -62, -96, -62, -127 };

		String b = new String(a, "utf-8");
		System.out.println(b);
		System.out.println(b + " 转换 " + toUTF8(b));

		String c = new String(b.getBytes("ISO8859-1"), "utf-8");
		System.out.println(c);
		System.out.println(c + " 转换 " + toUTF8(c));

		String d = "最代码";
		System.out.println(d + " 转换 " + toUTF8(d));

		printArray(d.getBytes());

		String e = "最代码网";
		System.out.println(e + " 转换 " + toUTF8(e));

		printArray(e.getBytes());

		String f = "《》";
		System.out.println(f + " 转换 " + toUTF8(f));

		String g = "¥";
		System.out.println(g + " 转换 " + toUTF8(g));

		String h = "abcedf1234<>d?";
		System.out.println(h + " 转换 " + toUTF8(h));

		String i = "やめて";

		System.out.println(i + " 转换 " + toUTF8(i));

		String j = new String(e.getBytes("utf-8"), "iso8859-1");
		System.out.println(j);
		printArray(j.getBytes());

	}

	public static void printArray(byte[] bs) {
		System.out.println("----");
		for (byte _bs : bs) {
			System.out.print(_bs + ",");
		}
		System.out.println("\n----");
	}
}

这样utf8编码的话对日文,韩文的乱码也可以支持。

运行结果:

java web开发中对http请求参数值出现乱码的终极解决方案


打赏

最代码最近下载分享源代码列表最近下载
最代码最近浏览分享源代码列表最近浏览
1358849392  LV21 2022年11月23日
目标是没有蛀牙  LV1 2021年4月16日
Thompson丶丶 2021年4月14日
暂无贡献等级
2469095052  LV8 2021年2月1日
爱睡觉的小石头 2020年12月7日
暂无贡献等级
gxh03097_2001  LV1 2020年10月28日
louis-pan  LV3 2020年9月14日
zyj1016  LV2 2020年5月25日
郑君尧 2020年5月2日
暂无贡献等级
943609920  LV10 2020年1月8日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友