Java URL Encode uriDecode(String uri)

Here you can find the source of uriDecode(String uri)

Description

Convert a URI reference (URI or URI fragment), in US-ASCII, with escaped characters taken from UTF-8, to the corresponding Unicode string.

License

Open Source License

Parameter

Parameter Description
uri The uri, in characters specified by RFC 2396 + '#'.

Return

The corresponding Unicode String.

Declaration

public static String uriDecode(String uri) 

Method Source Code

//package com.java2s;
/*//from   w  w w.ja v  a  2  s .com
 * OUtils.java
 *
 *  Copyright (c) 1995-2012, The University of Sheffield. See the file
 *  COPYRIGHT.txt in the software or at http://gate.ac.uk/gate/COPYRIGHT.txt
 *
 *  This file is part of GATE (see http://gate.ac.uk/), and is free
 *  software, licenced under the GNU Library General Public License,
 *  Version 2, June 1991 (in the distribution as file licence.html,
 *  and also available at http://gate.ac.uk/gate/licence.html).
 *
 *  Ian Roberts 05/05/2010
 *
 * $Id$
 *
 * This class includes code from the com.hp.hpl.jena.util.URIref class of jena
 * (http://jena.sourceforge.net) which is subject to the following licence:
 *
 *  (c) Copyright Hewlett-Packard Company 2001 
 *  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. The name of the author may not be used to endorse or promote products
 *    derived from this software without specific prior written permission.
    
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

public class Main {
    /**
     * Convert a URI reference (URI or URI fragment), in US-ASCII, with escaped
     * characters taken from UTF-8, to the corresponding Unicode string.
     * On ill-formed input the results are undefined, specifically if
     * the unescaped version is not a UTF-8 String, some String will be
     * returned.
     * @param uri The uri, in characters specified by RFC 2396 + '#'.
     * @return The corresponding Unicode String.
     * @exception IllegalArgumentException If a % hex sequence is ill-formed.
     */
    public static String uriDecode(String uri) {
        try {
            byte ascii[] = uri.getBytes("US-ASCII");
            byte utf8[] = new byte[ascii.length];
            int in = 0;
            int out = 0;
            while (in < ascii.length) {
                // Original JENA class left escaped percent signs (%25)
                // untouched, we convert them back to plain %
                if (ascii[in] == (byte) '%') {
                    in++;
                    utf8[out++] = (byte) (hexDecode(ascii[in]) * 16 | hexDecode(ascii[in + 1]));
                    in += 2;
                } else {
                    utf8[out++] = ascii[in++];
                }
            }
            return new String(utf8, 0, out, "UTF-8");
        } catch (java.io.UnsupportedEncodingException e) {
            throw new Error("The JVM is required to support UTF-8 and US-ASCII encodings.");
        } catch (ArrayIndexOutOfBoundsException ee) {
            throw new IllegalArgumentException("Incomplete Hex escape sequence in " + uri);
        }
    }

    private static final int hexDecode(byte b) {
        switch (b) {
        case (byte) 'a':
        case (byte) 'b':
        case (byte) 'c':
        case (byte) 'd':
        case (byte) 'e':
        case (byte) 'f':
            return (b & 255) - 'a' + 10;
        case (byte) 'A':
        case (byte) 'B':
        case (byte) 'C':
        case (byte) 'D':
        case (byte) 'E':
        case (byte) 'F':
            return b - (byte) 'A' + 10;
        case (byte) '0':
        case (byte) '1':
        case (byte) '2':
        case (byte) '3':
        case (byte) '4':
        case (byte) '5':
        case (byte) '6':
        case (byte) '7':
        case (byte) '8':
        case (byte) '9':
            return b - (byte) '0';
        default:
            throw new IllegalArgumentException("Bad Hex escape character: " + (b & 255));
        }
    }
}

Related

  1. encodeUrl(String url, String encoding)
  2. encodeURLComponent(final String s)
  3. encodeUrlPath(String pathSegment)
  4. unpaddedBase64UrlEncoded(final String unencodedString)
  5. uriDecode(String src)
  6. uriEncode(String uriRef)
  7. URLEncode(byte[] input)
  8. urlEncode(byte[] rs)
  9. urlencode(byte[] unencodedBytes)