Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   *  Licensed to the Apache Software Foundation (ASF) under one or more
   *  contributor license agreements.  See the NOTICE file distributed with
   *  this work for additional information regarding copyright ownership.
   *  The ASF licenses this file to You under the Apache License, Version 2.0
   *  (the "License"); you may not use this file except in compliance with
   *  the License.  You may obtain a copy of the License at
   *
   *      http://www.apache.org/licenses/LICENSE-2.0
  *
  *  Unless required by applicable law or agreed to in writing, software
  *  distributed under the License is distributed on an "AS IS" BASIS,
  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  *  See the License for the specific language governing permissions and
  *  limitations under the License.
  */
 
 package org.apache.tomcat.util.buf;
 
Efficient implementation for encoders. This class is not thread safe - you need one encoder per thread. The encoder will save and recycle the internal objects, avoiding garbage. You can add extra characters that you want preserved, for example while encoding a URL you can add "/".

Author(s):
Costin Manolache
Remy Maucherat
 
 public final class UEncoder {
 
     // Not static - the set may differ ( it's better than adding
     // an extra check for "/", "+", etc
     private BitSet safeChars=null;
     private C2BConverter c2b=null;
     private ByteChunk bb=null;
     private CharChunk cb=null;
     private CharChunk output=null;
 
     private String encoding="UTF8";
     
     public UEncoder() {
         initSafeChars();
     }
 
     public void setEncodingString s ) {
         =s;
     }
 
     public void addSafeCharacterchar c ) {
         .setc );
     }

    
URL Encode string, using a specified encoding.

Parameters:
buf The writer
s string to be encoded
Throws:
java.io.IOException If an I/O error occurs
 
     public CharChunk encodeURL(String sint startint end)
         throws IOException {
         if ( == null) {
              = new ByteChunk(8); // small enough.
              = new CharChunk(2); // small enough.
              = new CharChunk(64); // small enough.
              = new C2BConverter();
         } else {
             .recycle();
             .recycle();
         }
 
         for (int i = starti < endi++) {
             char c = s.charAt(i);
             if (.get(c)) {
                 .append(c);
             } else {
                 .append(c);
                 .convert();
 
                 // "surrogate" - UTF is _not_ 16 bit, but 21 !!!!
                 // ( while UCS is 31 ). Amazing...
                 if (c >= 0xD800 && c <= 0xDBFF) {
                     if ((i+1) < end) {
                         char d = s.charAt(i+1);
                         if (d >= 0xDC00 && d <= 0xDFFF) {
                             .append(d);
                             .convert();
                             i++;
                         }
                     }
                 }
 
                 urlEncode();
                 .recycle();
                 .recycle();
            }
        }
        
        return ;
    }
    protected void urlEncode(CharChunk outByteChunk bb)
        throws IOException {
        byte[] bytes = bb.getBuffer();
        for (int j = bb.getStart(); j < bb.getEnd(); j++) {
            out.append('%');
            char ch = Character.forDigit((bytes[j] >> 4) & 0xF, 16);
            out.append(ch);
            ch = Character.forDigit(bytes[j] & 0xF, 16);
            out.append(ch);
        }
    }
    
    // -------------------- Internal implementation --------------------
    
    private void initSafeChars() {
        =new BitSet(128);
        int i;
        for (i = 'a'i <= 'z'i++) {
            .set(i);
        }
        for (i = 'A'i <= 'Z'i++) {
            .set(i);
        }
        for (i = '0'i <= '9'i++) {
            .set(i);
        }
        //safe
        .set('$');
        .set('-');
        .set('_');
        .set('.');
        // Dangerous: someone may treat this as " "
        // RFC1738 does allow it, it's not reserved
        //    safeChars.set('+');
        //extra
        .set('!');
        .set('*');
        .set('\'');
        .set('(');
        .set(')');
        .set(',');	
    }
New to GrepCode? Check out our FAQ X