最代码广告位
software0116的gravatar头像
software01162012-10-13 18:45:20

关于地址栏传递中文参数的乱码的java终极解决方案

乱码,乱码,头大,烦,话说设置Tomcat后可以解决,但有的时候不管用了,这时,我们可以考虑转码方式不直接传中文,在js里用escape转码,记得需要用两次,

如: var str=escape("这是中文参数"); str=escape(str); xxx.do?name=str;

在后台通过一个类的方法再转回来: Escape.unescape(request.getParameter("name"));

package com.zhangjun.software;
/**
 * 编转码java实现类.
 */
public class Escape {

	/** The Constant hex. */
	private final static String[] hex = { "00", "01", "02", "03", "04", "05",
			"06", "07", "08", "09", "0A", "0B", "0C", "0D", "0E", "0F", "10",
			"11", "12", "13", "14", "15", "16", "17", "18", "19", "1A", "1B",
			"1C", "1D", "1E", "1F", "20", "21", "22", "23", "24", "25", "26",
			"27", "28", "29", "2A", "2B", "2C", "2D", "2E", "2F", "30", "31",
			"32", "33", "34", "35", "36", "37", "38", "39", "3A", "3B", "3C",
			"3D", "3E", "3F", "40", "41", "42", "43", "44", "45", "46", "47",
			"48", "49", "4A", "4B", "4C", "4D", "4E", "4F", "50", "51", "52",
			"53", "54", "55", "56", "57", "58", "59", "5A", "5B", "5C", "5D",
			"5E", "5F", "60", "61", "62", "63", "64", "65", "66", "67", "68",
			"69", "6A", "6B", "6C", "6D", "6E", "6F", "70", "71", "72", "73",
			"74", "75", "76", "77", "78", "79", "7A", "7B", "7C", "7D", "7E",
			"7F", "80", "81", "82", "83", "84", "85", "86", "87", "88", "89",
			"8A", "8B", "8C", "8D", "8E", "8F", "90", "91", "92", "93", "94",
			"95", "96", "97", "98", "99", "9A", "9B", "9C", "9D", "9E", "9F",
			"A0", "A1", "A2", "A3", "A4", "A5", "A6", "A7", "A8", "A9", "AA",
			"AB", "AC", "AD", "AE", "AF", "B0", "B1", "B2", "B3", "B4", "B5",
			"B6", "B7", "B8", "B9", "BA", "BB", "BC", "BD", "BE", "BF", "C0",
			"C1", "C2", "C3", "C4", "C5", "C6", "C7", "C8", "C9", "CA", "CB",
			"CC", "CD", "CE", "CF", "D0", "D1", "D2", "D3", "D4", "D5", "D6",
			"D7", "D8", "D9", "DA", "DB", "DC", "DD", "DE", "DF", "E0", "E1",
			"E2", "E3", "E4", "E5", "E6", "E7", "E8", "E9", "EA", "EB", "EC",
			"ED", "EE", "EF", "F0", "F1", "F2", "F3", "F4", "F5", "F6", "F7",
			"F8", "F9", "FA", "FB", "FC", "FD", "FE", "FF" };

	/** The Constant val. */
	private final static byte[] val = { 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
			0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
			0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
			0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
			0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x00, 0x01,
			0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x3F, 0x3F, 0x3F,
			0x3F, 0x3F, 0x3F, 0x3F, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x3F,
			0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
			0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
			0x3F, 0x3F, 0x3F, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x3F, 0x3F,
			0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
			0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
			0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
			0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
			0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
			0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
			0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
			0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
			0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
			0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
			0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
			0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
			0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F,
			0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F };
	/**
	 * Escape.
	 * @param s the s
	 * @return the string
	 * 编码
	 * @param s
	 * @return
	 */
	public static String escape(String s) {
		if (s != null) {
			StringBuffer sbuf = new StringBuffer();
			int len = s.length();
			for (int i = 0; i < len; i++) {
				int ch = s.charAt(i);
				if ('A' <= ch && ch <= 'Z') {
					sbuf.append((char) ch);
				} else if ('a' <= ch && ch <= 'z') {
					sbuf.append((char) ch);
				} else if ('0' <= ch && ch <= '9') {
					sbuf.append((char) ch);
				} else if (ch == '-' || ch == '_' || ch == '.' || ch == '!'
						|| ch == '~' || ch == '*' || ch == '\'' || ch == '('
						|| ch == ')') {
					sbuf.append((char) ch);
				} else if (ch <= 0x007F) {
					sbuf.append('%');
					sbuf.append(hex[ch]);
				} else {
					sbuf.append('%');
					sbuf.append('u');
					sbuf.append(hex[(ch >>> 8)]);
					sbuf.append(hex[(0x00FF & ch)]);
				}
			}
			return sbuf.toString();
		}
		return null;
	}
	/**
	 * Unescape.
	 * @param s  the s
	 * @return the string
	 * 解码 说明:本方法保证 不论参数s是否经过escape()编码,均能得到正确的“解码”结果
	 * @param s
	 * @return
	 */
	public static String unescape(String s) {
		if (s != null) {
			StringBuffer sbuf = new StringBuffer();
			int i = 0;
			int len = s.length();
			while (i < len) {
				int ch = s.charAt(i);
				if ('A' <= ch && ch <= 'Z') {
					sbuf.append((char) ch);
				} else if ('a' <= ch && ch <= 'z') {
					sbuf.append((char) ch);
				} else if ('0' <= ch && ch <= '9') {
					sbuf.append((char) ch);
				} else if (ch == '-' || ch == '_' || ch == '.' || ch == '!'
						|| ch == '~' || ch == '*' || ch == '\'' || ch == '('
						|| ch == ')') {
					sbuf.append((char) ch);
				} else if (ch == '%') {
					int cint = 0;
					if ('u' != s.charAt(i + 1)) {
						cint = (cint << 4) | val[s.charAt(i + 1)];
						cint = (cint << 4) | val[s.charAt(i + 2)];
						i += 2;
					} else {
						cint = (cint << 4) | val[s.charAt(i + 2)];
						cint = (cint << 4) | val[s.charAt(i + 3)];
						cint = (cint << 4) | val[s.charAt(i + 4)];
						cint = (cint << 4) | val[s.charAt(i + 5)];
						i += 5;
					}
					sbuf.append((char) cint);
				} else {
					sbuf.append((char) ch);
				}
				i++;
			}
			return sbuf.toString();
		}
		return null;
	}
	public static void main(String[] args) {
		Escape escape = new Escape();
		String bb = escape.escape("北京欢迎你");
		System.out.println(bb);
		System.out.println(escape.unescape(bb));
		
	}
}


最代码官方编辑于2013-12-27 11:33:23


骑着猪猪去逛街编辑于2013-12-27 11:33:55


打赏

文件名:luanMa.zip,文件大小:11K下载
  • /
      • /luanMa
        • /luanMa/.classpath
          • /luanMa/.myeclipse
          • /luanMa/.mymetadata
          • /luanMa/.project
            • /luanMa/.settings
              • /luanMa/.settings/.jsdtscope
              • /luanMa/.settings/org.eclipse.jdt.core.prefs
              • /luanMa/.settings/org.eclipse.wst.jsdt.ui.superType.container
              • /luanMa/.settings/org.eclipse.wst.jsdt.ui.superType.name
    最代码最近下载分享源代码列表最近下载
    liyang3136 LV202018年4月11日
    太阳月亮
    樱花满天 LV242017年3月27日
    太阳月亮月亮
    骑着猪猪去逛街 LV322013年12月27日
    太阳太阳
    最代码最近浏览分享源代码列表最近浏览
    lelelada LV52019年12月18日
    月亮星星
    hui0619 LV12019年11月7日
    星星
    Alasica LV12019年6月11日
    星星
    柚子呐2019年5月6日
    暂无贡献等级
    sky LV222019年4月21日
    太阳月亮星星星星
    maxthoncxy LV32019年2月8日
    星星星星星星
    阿拉斯加 LV22018年11月19日
    星星星星
    shenqiming LV12018年10月26日
    星星
    lw19900921 LV242018年9月20日
    太阳月亮月亮
    王超123 LV92018年8月2日
    月亮月亮星星
    顶部客服微信二维码底部
    >扫描二维码关注最代码为好友扫描二维码关注最代码为好友