iiop-openjdk/src/main/java/org/wildfly/iiop/openjdk/naming/jndi/UrlUtil.java
public static String decode(String s, String enc)
            throws MalformedURLException, UnsupportedEncodingException {

        int length = s.length();
        byte[] bytes = new byte[length];
        int j = 0;

        for (int i = 0; i < length; i++) {
            if (s.charAt(i) == '%') {
                i++;  // skip %
                try {
                    bytes[j++] = (byte)
                            Integer.parseInt(s.substring(i, i + 2), 16);

                } catch (Exception e) {
                    throw IIOPLogger.ROOT_LOGGER.invalidURIEncoding(s);
                }
                i++;  // skip first hex char; for loop will skip second one
            } else {
                bytes[j++] = (byte) s.charAt(i);
            }
        }

        return new String(bytes, 0, j, enc);
    }
public static String decode(String s, String enc)
            throws MalformedURLException, UnsupportedEncodingException {

        int length = s.length();
        byte[] bytes = new byte[length];
        int j = 0;

        for (int i = 0; i < length; i++) {
            if (s.charAt(i) == '%') {
                i++;  // skip %
                try {
                    bytes[j++] = (byte)
                            Integer.parseInt(s.substring(i, i + 2), 16);

                } catch (Exception e) {
                    throw IIOPLogger.ROOT_LOGGER.invalidURIEncoding(s);
                }
                i++;  // skip first hex char; for loop will skip second one
            } else {
                bytes[j++] = (byte) s.charAt(i);
            }
        }

        return new String(bytes, 0, j, enc);
    }
Decode a URI string (according to RFC 2396).
<p/>
Three-character sequences '%xy', where 'xy' is the two-digit
hexadecimal representation of the lower 8-bits of a character,
are decoded into the character itself.
<p/>
The string is subsequently converted using the specified encoding