public URLNormalizer decodeUnreservedCharacters() {
        if (url.contains("%")) {
            StringBuffer sb = new StringBuffer();
            Matcher m = PATTERN_PERCENT_ENCODED_CHAR.matcher(url);
            try {
                while (m.find()) {
                    String enc = m.group(1).toUpperCase();
                    if (isEncodedUnreservedCharacter(enc)) {
                        m.appendReplacement(sb, URLDecoder.decode(
                                enc, StandardCharsets.UTF_8.toString()));
                    }
                }
            } catch (UnsupportedEncodingException e) {
                logger.debug("UTF-8 is not supported by your system. "
                        + "URL will remain unchanged:" + url, e);
            }
            url = m.appendTail(sb).toString();
        }
        return this;
    }
@Test
    public void testDecodeUnreservedCharacters() {
        // ALPHA (%41-%5A and %61-%7A), DIGIT (%30-%39), hyphen (%2D),
        // period (%2E), underscore (%5F), or tilde (%7E)
        s = "http://www.example.com/%41%42%59%5Aalpha"
                + "%61%62%79%7A/digit%30%31%38%39/%2Dhyphen/period%2E"
                + "/underscore%5F/%7Etilde/reserved%2F%3A%5B%26";
        t = "http://www.example.com/ABYZalphaabyz/digit0189"
                + "/-hyphen/period./underscore_/~tilde/reserved%2F%3A%5B%26";
        assertEquals(t, n(s).decodeUnreservedCharacters().toString());
    }