Tomcat中的URLEncoder,使用十六进制来编码

来源:互联网 发布:破解苹果mac密码 编辑:程序博客网 时间:2024/06/05 05:30
package org.apache.catalina.util;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.OutputStreamWriter;import java.util.BitSet;public class URLEncoder {//十六进制基本字符 protected static final char[] hexadecimal =    {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',     'A', 'B', 'C', 'D', 'E', 'F'};    //Array containing the safe characters set.    //BitSet 实现了一个按需增长的位向量    protected BitSet safeCharacters = new BitSet(256);    public URLEncoder() {        for (char i = 'a'; i <= 'z'; i++) {            addSafeCharacter(i);        }        for (char i = 'A'; i <= 'Z'; i++) {            addSafeCharacter(i);        }        for (char i = '0'; i <= '9'; i++) {            addSafeCharacter(i);        }    }    public void addSafeCharacter( char c ) {        safeCharacters.set( c );    }    public String encode( String path ) {        int maxBytesPerChar = 10;        StringBuilder rewrittenPath = new StringBuilder(path.length());        //使用OutputStreamReader组装ByteArrayOutputStream将字符写入到二进制数组中        ByteArrayOutputStream buf = new ByteArrayOutputStream(maxBytesPerChar);        OutputStreamWriter writer = null;        try {            writer = new OutputStreamWriter(buf, "UTF8");        } catch (Exception e) {            e.printStackTrace();            writer = new OutputStreamWriter(buf);        }        for (int i = 0; i < path.length(); i++) {            int c = path.charAt(i);            if (safeCharacters.get(c)) {                rewrittenPath.append((char)c);            } else {                // convert to external encoding before hex conversion                try {                    writer.write((char)c);                    writer.flush();                } catch(IOException e) {                    buf.reset();                    continue;                }                byte[] ba = buf.toByteArray();                for (int j = 0; j < ba.length; j++) {                    // Converting each byte in the buffer                    byte toEncode = ba[j];                    rewrittenPath.append('%');                   //编码规则                    int low = toEncode & 0x0f;                    int high = (toEncode & 0xf0) >> 4;                    rewrittenPath.append(hexadecimal[high]);                    rewrittenPath.append(hexadecimal[low]);                }                buf.reset();            }        }        return rewrittenPath.toString();    }}


原创粉丝点击