URLDecoder: Illegal hex characters in escape (%) pattern - For input string:

发布时间:2024年01月07日

来自:http://stackoverflow.com/questions/11257509/urldecoder-illegal-hex-characters-in-escape-pattern-for-input-string-p

Whoever created the URL should have?percent encoded?the?%?by writing?%25.

Example invalid URL

http://example.com/test?q=%.P

Example valid URL

http://example.com/test?q=%25.P

The answer?provided by Mark Byers will work just fine if there're only?%?chars that need to be escaped but will fail if url contains percent-encoded chars. To avoid this there's a little bit more work needed.

In percent-encoding (url-encoding)?only?reserved?and?unreserved?chars won't be percent-encoded.

Reserved chars:
╔═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╗
║ ! ║ # ║ $ ║ & ║ ' ║ ( ║ ) ║ * ║ + ║ , ║ / ║ : ║ ; ║ = ║ ? ║ @ ║ [ ║ ] ║
╚═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╝

Unreserved chars:
╔═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╗
║ A ║ B ║ C ║ D ║ E ║ F ║ G ║ H ║ I ║ J ║ K ║ L ║ M ║ N ║ O ║ P ║ Q ║ R ║
╚═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╝
╔═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╗
║ S ║ T ║ U ║ V ║ W ║ X ║ Y ║ Z ║ a ║ b ║ c ║ d ║ e ║ f ║ g ║ h ║ i ║ j ║
╚═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╝
╔═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╗
║ k ║ l ║ m ║ n ║ o ║ p ║ q ║ r ║ s ║ t ║ u ║ v ║ w ║ x ║ y ║ z ║
╚═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╝
╔═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╦═══╗
║ 0 ║ 1 ║ 2 ║ 3 ║ 4 ║ 5 ║ 6 ║ 7 ║ 8 ║ 9 ║ - ║ _ ║ . ║ ~ ║
╚═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╝

According to?RFC 3986?percent-encoded character has following format:?% + hex. So if you want to properly escape url that has unescaped?%?chars without breaking the whole url before actually decoding it, you need to replace only those?%?signs that are not followed by hex.

Finding substring that violates some pattern is pretty easy task with regex. In this case pattern will look like this:

%(?![0-9a-fA-F]{2})

Sample:

class Main
{
    public static void main (String[] args) throws java.lang.Exception
    {
        String url = "http://example.com/test?q=%.P%20some%20other%20Text";
        url = url.replaceAll("%(?![0-9a-fA-F]{2})", "%25");
        System.out.println(url);
    }
}

文章来源:https://blog.csdn.net/ok060/article/details/135436942
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。