一颗开花的树

谈笑但看风云起,龙腾尚待惊蛰春.

 

Java中页面重定向乱码终极解决方案-----java, weblogic, websphere, aix,unix,linux,windows,中英文等任何语言

  1import java.io.ByteArrayOutputStream;
  2import javax.servlet.http.HttpServletRequest;
  3
  4public 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

posted on 2010-05-31 21:23 泽来-王者之剑 阅读(1452) 评论(0)  编辑  收藏 所属分类: j2se


只有注册用户登录后才能发表评论。


网站导航:
 

导航

统计

常用链接

留言簿(4)

随笔分类

随笔档案

友情链接

搜索

最新评论