URLDecoder:转义(%)模式中的非法十六进制字符 - 对于输入字符串:“。P”

时间:2012-06-29 07:07:33

标签: java

如何正确解码Java中包含%的字符串 当我使用URLDecoder.decode()时,我收到以下错误:

IllegalArgumentException: java.lang.IllegalArgumentException: URLDecoder: Illegal hex characters in escape (%) pattern - For input string: ".P"
    at java.net.URLDecoder.decode(Unknown Source)

无论如何都要绕过这个特殊的考虑。或者关于如何使用%字符的任何想法?

3 个答案:

答案 0 :(得分:14)

Mark Byers提供的

The answer可以正常工作,如果只有%个字符需要转义,但如果网址包含百分比编码的字符则会失败。为了避免这种情况,需要做更多的工作。

在百分比编码(url-encoding)中,只有 reservedunreserved字符不会被百分比编码。

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 ║ - ║ _ ║ . ║ ~ ║
╚═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╩═══╝

根据RFC 3986百分比编码的字符具有以下格式:% + hex。因此,如果您想要在实际解码之前正确地转义具有未转义%个字符而未破坏整个网址的网址,则只需要替换那些未跟随十六进制的%个符号。

使用正则表达式查找违反某些模式的子字符串非常简单。在这种情况下,模式将如下所示:

%(?![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);
    }
}

答案 1 :(得分:7)

通过撰写%,创建网址的人应该percent encoded %25

示例无效网址

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

示例有效网址

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

答案 2 :(得分:2)

在致电%之前将%25替换为URLDecoder.decode