Java中页面重定向乱码终极解决方案-----java, weblogic, websphere, aix,unix,linux,windows,中英文等任何语言
1
import
java.io.ByteArrayOutputStream;
2 import javax.servlet.http.HttpServletRequest;
3
4 public class URLDecoder {
5
6 /** *//**
7 * 前言:
8 * 多年java开发,在各服务器,中间件以及各异的字符集环境中,深受页面重定向编码乱码之苦,终于痛下决心解决这个问题。
9 * 思路:
10 * 在重定向前 将 &a=b 的名值对编码为 16进制
11 * 在request.getparameter("")时将 重定向前的已经编码的字符串进行解码
12 *
13 * Java中页面重定向乱码终极解决方案-----java, weblogic, websphere, aix,unix,linux,windows,中英文等任何语言
14 */
15
16 /** *//**
17 * 16进制数字字符集
18 */
19 private static String hexString = "0123456789ABCDEF ";
20 public final static String NothingStr = "";
21 public final static String NullStr = "null#NULL#Null";
22
23
24
25
26 /** *//**
27 * 用于页面的名值对取值方法
28 */
29 public static String getParameter(HttpServletRequest request, String parameter) {
30 if (isNull(parameter)) {
31 return "";
32 }
33 String value = "";
34 // 先编码查询串
35 String params = enCodeHex(parameter);
36 // 取出对应的值
37 value = (String) request.getParameter(params);
38 // 解码值
39 value = deCodeHex(value);
40 return value;
41 }
42
43
44 /** *//**
45 * 编码QueryString
46 * @param str
47 * @return
48 */
49 public static String encodeQueryString(String params) {
50 if (isNull(params)) {
51 return "";
52 }
53 StringBuffer hexStrBuffer = new StringBuffer();
54 if (params.startsWith("?")) {
55 // ?开头的queryString先处理?
56 hexStrBuffer.append("?");
57 String firstStr = params.substring(params.indexOf("?") + 1, params.indexOf("&"));
58 String strIn[] = firstStr.split("=");
59 if (strIn.length == 2) {
60 hexStrBuffer.append(enCodeHex(strIn[0]));
61 hexStrBuffer.append("=");
62 hexStrBuffer.append(enCodeHex(strIn[1]));
63 }
64 params = params.substring(params.indexOf("&"));
65 }
66 String strOut[] = params.split("&");
67 boolean bool = false;
68 for (int i = 0; i < strOut.length; i++) {
69 String strIn[] = strOut[i].split("=");
70 if (strIn.length == 2) {
71 if (params.startsWith("&")) {
72 bool = true;
73 } else if (!params.startsWith("&") && i > 0) {
74 bool = true;
75 }
76 if (bool) {
77 hexStrBuffer.append("&");
78 }
79 hexStrBuffer.append(enCodeHex(strIn[0]));
80 hexStrBuffer.append("=");
81 hexStrBuffer.append(enCodeHex(strIn[1]));
82 }
83 }
84 return hexStrBuffer.toString();
85 }
86
87 /** *//**
88 * 解码QueryString
89 * @param params
90 * @return
91 */
92 public static String deCodeString(String params) {
93 System.out.println("URLDecoder deCodeString: " + params);
94 if (isNull(params)) {
95 return "";
96 }
97 StringBuffer hexStrBuffer = new StringBuffer();
98 // ?开头的queryString先处理?
99 if (params.startsWith("?")) {
100 hexStrBuffer.append("?");
101 String firstStr = params.substring(params.indexOf("?") + 1, params.indexOf("&"));
102 String strIn[] = firstStr.split("=");
103 if (strIn.length == 2) {
104 hexStrBuffer.append(deCodeHex(strIn[0]));
105 hexStrBuffer.append("=");
106 hexStrBuffer.append(deCodeHex(strIn[1]));
107 }
108 params = params.substring(params.indexOf("&"));
109 }
110 String strOut[] = params.split("&");
111 boolean bool = false;
112 for (int i = 0; i < strOut.length; i++) {
113 String strIn[] = strOut[i].split("=");
114 if (strIn.length == 2) {
115 if (params.startsWith("&")) {
116 bool = true;
117 } else if (!params.startsWith("&") && i > 0) {
118 bool = true;
119 }
120 if (bool) {
121 hexStrBuffer.append("&");
122 }
123 hexStrBuffer.append(deCodeHex(strIn[0]));
124 hexStrBuffer.append("=");
125 hexStrBuffer.append(deCodeHex(strIn[1]));
126 }
127 }
128 return hexStrBuffer.toString();
129 }
130
131
132 /** *//**
133 * 判断是否是空串
134 *
135 * @param s
136 * @return
137 */
138 private static boolean isNull(String s) {
139 if (s == null || (NullStr.indexOf(s) > -1 || s.trim().equals(NothingStr))
140 || "undefined".equals(String.valueOf(s))) {
141 return true;
142 }
143 return false;
144 }
145
146 /**//*
147 * 将字符串编码成16进制数字,适用于所有字符(包括中文)
148 */
149 private static String enCodeHex(String str) {
150 if (isNull(str)) {
151 return "";
152 }
153 // 根据默认编码获取字节数组
154 byte[] bytes = str.getBytes();
155 StringBuilder sb = new StringBuilder(bytes.length * 2);
156 // 将字节数组中每个字节拆解成2位16进制整数
157 for (int i = 0; i < bytes.length; i++) {
158 sb.append(hexString.charAt((bytes[i] & 0xf0) >> 4));
159 sb.append(hexString.charAt((bytes[i] & 0x0f) >> 0));
160 }
161 return sb.toString();
162 }
163
164 /**//*
165 * 将16进制数字解码成字符串,适用于所有字符(包括中文)
166 */
167 private static String deCodeHex(String bytes) {
168 if (isNull(bytes)) {
169 return "";
170 }
171 ByteArrayOutputStream baos = new ByteArrayOutputStream(bytes.length() / 2);
172 // 将每2位16进制整数组装成一个字节
173 for (int i = 0; i < bytes.length(); i += 2) {
174 baos.write((hexString.indexOf(bytes.charAt(i)) << 4 | hexString.indexOf(bytes.charAt(i + 1))));
175 }
176 return new String(baos.toByteArray());
177 }
178}
179
2 import javax.servlet.http.HttpServletRequest;
3
4 public class URLDecoder {
5
6 /** *//**
7 * 前言:
8 * 多年java开发,在各服务器,中间件以及各异的字符集环境中,深受页面重定向编码乱码之苦,终于痛下决心解决这个问题。
9 * 思路:
10 * 在重定向前 将 &a=b 的名值对编码为 16进制
11 * 在request.getparameter("")时将 重定向前的已经编码的字符串进行解码
12 *
13 * Java中页面重定向乱码终极解决方案-----java, weblogic, websphere, aix,unix,linux,windows,中英文等任何语言
14 */
15
16 /** *//**
17 * 16进制数字字符集
18 */
19 private static String hexString = "0123456789ABCDEF ";
20 public final static String NothingStr = "";
21 public final static String NullStr = "null#NULL#Null";
22
23
24
25
26 /** *//**
27 * 用于页面的名值对取值方法
28 */
29 public static String getParameter(HttpServletRequest request, String parameter) {
30 if (isNull(parameter)) {
31 return "";
32 }
33 String value = "";
34 // 先编码查询串
35 String params = enCodeHex(parameter);
36 // 取出对应的值
37 value = (String) request.getParameter(params);
38 // 解码值
39 value = deCodeHex(value);
40 return value;
41 }
42
43
44 /** *//**
45 * 编码QueryString
46 * @param str
47 * @return
48 */
49 public static String encodeQueryString(String params) {
50 if (isNull(params)) {
51 return "";
52 }
53 StringBuffer hexStrBuffer = new StringBuffer();
54 if (params.startsWith("?")) {
55 // ?开头的queryString先处理?
56 hexStrBuffer.append("?");
57 String firstStr = params.substring(params.indexOf("?") + 1, params.indexOf("&"));
58 String strIn[] = firstStr.split("=");
59 if (strIn.length == 2) {
60 hexStrBuffer.append(enCodeHex(strIn[0]));
61 hexStrBuffer.append("=");
62 hexStrBuffer.append(enCodeHex(strIn[1]));
63 }
64 params = params.substring(params.indexOf("&"));
65 }
66 String strOut[] = params.split("&");
67 boolean bool = false;
68 for (int i = 0; i < strOut.length; i++) {
69 String strIn[] = strOut[i].split("=");
70 if (strIn.length == 2) {
71 if (params.startsWith("&")) {
72 bool = true;
73 } else if (!params.startsWith("&") && i > 0) {
74 bool = true;
75 }
76 if (bool) {
77 hexStrBuffer.append("&");
78 }
79 hexStrBuffer.append(enCodeHex(strIn[0]));
80 hexStrBuffer.append("=");
81 hexStrBuffer.append(enCodeHex(strIn[1]));
82 }
83 }
84 return hexStrBuffer.toString();
85 }
86
87 /** *//**
88 * 解码QueryString
89 * @param params
90 * @return
91 */
92 public static String deCodeString(String params) {
93 System.out.println("URLDecoder deCodeString: " + params);
94 if (isNull(params)) {
95 return "";
96 }
97 StringBuffer hexStrBuffer = new StringBuffer();
98 // ?开头的queryString先处理?
99 if (params.startsWith("?")) {
100 hexStrBuffer.append("?");
101 String firstStr = params.substring(params.indexOf("?") + 1, params.indexOf("&"));
102 String strIn[] = firstStr.split("=");
103 if (strIn.length == 2) {
104 hexStrBuffer.append(deCodeHex(strIn[0]));
105 hexStrBuffer.append("=");
106 hexStrBuffer.append(deCodeHex(strIn[1]));
107 }
108 params = params.substring(params.indexOf("&"));
109 }
110 String strOut[] = params.split("&");
111 boolean bool = false;
112 for (int i = 0; i < strOut.length; i++) {
113 String strIn[] = strOut[i].split("=");
114 if (strIn.length == 2) {
115 if (params.startsWith("&")) {
116 bool = true;
117 } else if (!params.startsWith("&") && i > 0) {
118 bool = true;
119 }
120 if (bool) {
121 hexStrBuffer.append("&");
122 }
123 hexStrBuffer.append(deCodeHex(strIn[0]));
124 hexStrBuffer.append("=");
125 hexStrBuffer.append(deCodeHex(strIn[1]));
126 }
127 }
128 return hexStrBuffer.toString();
129 }
130
131
132 /** *//**
133 * 判断是否是空串
134 *
135 * @param s
136 * @return
137 */
138 private static boolean isNull(String s) {
139 if (s == null || (NullStr.indexOf(s) > -1 || s.trim().equals(NothingStr))
140 || "undefined".equals(String.valueOf(s))) {
141 return true;
142 }
143 return false;
144 }
145
146 /**//*
147 * 将字符串编码成16进制数字,适用于所有字符(包括中文)
148 */
149 private static String enCodeHex(String str) {
150 if (isNull(str)) {
151 return "";
152 }
153 // 根据默认编码获取字节数组
154 byte[] bytes = str.getBytes();
155 StringBuilder sb = new StringBuilder(bytes.length * 2);
156 // 将字节数组中每个字节拆解成2位16进制整数
157 for (int i = 0; i < bytes.length; i++) {
158 sb.append(hexString.charAt((bytes[i] & 0xf0) >> 4));
159 sb.append(hexString.charAt((bytes[i] & 0x0f) >> 0));
160 }
161 return sb.toString();
162 }
163
164 /**//*
165 * 将16进制数字解码成字符串,适用于所有字符(包括中文)
166 */
167 private static String deCodeHex(String bytes) {
168 if (isNull(bytes)) {
169 return "";
170 }
171 ByteArrayOutputStream baos = new ByteArrayOutputStream(bytes.length() / 2);
172 // 将每2位16进制整数组装成一个字节
173 for (int i = 0; i < bytes.length(); i += 2) {
174 baos.write((hexString.indexOf(bytes.charAt(i)) << 4 | hexString.indexOf(bytes.charAt(i + 1))));
175 }
176 return new String(baos.toByteArray());
177 }
178}
179