FileDocCategorySizeDatePackage
URLEncoder.javaAPI DocApache Tomcat 6.0.143644Fri Jul 20 04:20:36 BST 2007org.apache.catalina.util

URLEncoder

public class URLEncoder extends Object
This class is very similar to the java.net.URLEncoder class. Unfortunately, with java.net.URLEncoder there is no way to specify to the java.net.URLEncoder which characters should NOT be encoded. This code was moved from DefaultServlet.java
author
Craig R. McClanahan
author
Remy Maucherat

Fields Summary
protected static final char[]
hexadecimal
protected BitSet
safeCharacters
Constructors Summary
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);
        }
    
Methods Summary
public voidaddSafeCharacter(char c)

	safeCharacters.set( c );
    
public java.lang.Stringencode(java.lang.String path)

        int maxBytesPerChar = 10;
        int caseDiff = ('a" - 'A");
        StringBuffer rewrittenPath = new StringBuffer(path.length());
        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 = (int) 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 = (int) (toEncode & 0x0f);
                    int high = (int) ((toEncode & 0xf0) >> 4);
                    rewrittenPath.append(hexadecimal[high]);
                    rewrittenPath.append(hexadecimal[low]);
                }
                buf.reset();
            }
        }
        return rewrittenPath.toString();