如果是英文字母、数字、下划线等不会引起混淆的字符,可以直接用该字符表示。
比如:? & = 空格 等字符在Url和Form 编码的时候有特殊用处就不能用文本表示。
不能直接用的字符,先用UTF-8编码,然后按字节再转换成文本方式。
每个字节用 %XX 的方式表示(XX是该字节的16进制)。

解决方案 »

  1.   

    程序中可以用
    java.net.URLEncoder.encode(str,"UTF8");编码
    java.net.URLDecoder.decode(str,"UTF8");解码
      

  2.   

    public static String encoding(String s)
        {
            byte[] b;
            try
            {
                b = s.getBytes("UTF8");
            }
            catch(java.io.UnsupportedEncodingException e)
            {
                //应该不会执行到这里
                e.printStackTrace();
                return null;
            }
            StringBuffer sb = new StringBuffer();
            for(int i=0;i<b.length;i++)
            {
                int c = 0xff & (int)b[i];
                if ((c >= 'A' && c <= 'Z')
                        || (c>='a' && c <= 'z')
                        || (c>='0' && c <= '9')
                        || c=='_' || c=='.'
                        || c=='-' || c=='*')
                    sb.append((char)c);
                else if(c == ' ')
                    sb.append("%20");//标准上使用'+',但好像IE里都用%20
                else
                {
                    sb.append('%');
                    String s1 = Integer.toHexString(c).toUpperCase();
                    if (s1.length() == 1)
                        sb.append('0');
                    sb.append(s1);
                }
            }
            return sb.toString();
        }
        public static String decoding(String s)
        {
            java.io.ByteArrayOutputStream out = new java.io.ByteArrayOutputStream();
            for(int i=0;i<s.length();i++)
            {
                int c = s.charAt(i);
                if (c != '%')
                    out.write(c);
                else
                {
                    out.write(Integer.parseInt(s.substring(i+1,i+3),16));
                    i+=2;
                }
            }
            try
            {
                return new String(out.toByteArray(), "UTF8");
            }
            catch(java.io.UnsupportedEncodingException e)
            {
                //应该不会执行到这里
                e.printStackTrace();
                return null;
            }
        }