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)

この特別な考慮事項をバイパスする方法はありますか。または % 文字の使い方について何か考えはありますか?

4

3 に答える 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 を適切にエスケープしたい場合は%、16 進数が続かない記号のみを置き換える必要があります。

正規表現を使用すると、パターンに違反する部分文字列を見つけるのは非常に簡単です。この場合、パターンは次のようになります。

%(?![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);
    }
}
于 2013-08-21T07:50:56.090 に答える
8

URLを作成した人は誰でも、を書くことによってパーセントエンコードする必要があります。%%25

無効なURLの例

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

有効なURLの例

http://example.com/test?q=%25.P
于 2012-06-29T07:09:26.377 に答える
3

before call に%置き換えます。%25URLDecoder.decode

于 2013-08-21T06:13:00.533 に答える