URLDecoder:转义(%)模式中包含非法十六进制字符 - 输入字符串为“.P”

5

如何在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)

有没有什么办法可以绕过这种特殊考虑?或者有任何关于如何使用百分号的想法?

6
听起来你正在解码一个未被正确编码的字符串,这就是问题所在。 - Sean Owen
这是Android进行URL编码的方式。 - budsiya
3个回答

19

Mark Byers提供的答案在只需要转义%字符时可以正常工作,但如果url包含百分号编码的字符,则会失败。为了避免这种情况,需要进行更多的工作。

在百分数编码(url编码)中,仅有保留字符非保留字符不会被百分号编码。

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。因此,如果您想正确转义具有未转义%字符的url,而不会在实际解码之前破坏整个url,则只需替换那些没有后跟十六进制的%标记即可。
使用正则表达式查找违反某些模式的子字符串是相当容易的任务。 在这种情况下,模式看起来像这样:
%(?![0-9a-fA-F]{2})

示例:

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);
    }
}

8

创建URL的人应该使用百分号编码,通过写入%25来对%进行编码。

无效URL示例

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

有效URL示例

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

7
我认为需要对具有%十六进制转义字符的字符串进行编码,因为如果存在裸露的%,该字符串将无效。该%符号因此需要被编码。 - ThiefMaster

3

在调用 URLDecoder.decode 前,将 % 替换为 %25


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接