使用java中的URLDecoder将%解码到空间?

Sni*_*per 6 java urlencode utf-8 rfc upi

我有一个用例,我必须解码URI的queryParameter并执行操作(超出此问题的范围).

假设我有一个URI,我必须解码它.现在我知道目前所有的%20都将被转换为空格,而创建URI 空间应该用%20来表示,但可能会出现我可能获得带%作为空间的URI的情况.因此,我想将%转换为空格以保持向后兼容性.最后有一个注释有助于理解这个问题.

我尝试过replaceall() %,%20但是后来%20又会变成%2020许多其他例外.

这是读取UPI URI所必需的,根据NPCI的官方文件:

注意:考虑到当前的PSP应用程序被开发为"%"作为空格(""),银行PSP应该同时支持"%"和"%20",直到生态系统与修订版对齐为止.因此,应确保向后兼容性.

编辑1基于pshemo评论 -

我试过了

str.replaceAll("%(?![0-9a-fA-F])","%20")
Run Code Online (Sandbox Code Playgroud)

一个不满足上述正则表达式的案例是"upi:// pay?pa = praksh%40kmbl&pn = Prakash%Abmar&cu = INR"

输出是pn - > Prakash" some othercharacter "mar

fho*_*ann 1

可能不是您想要的答案,但这可能会有所帮助:

public class Test {

    public static void main(String... a) {
        try {
            //
            String u = "upi://pay?pa=praksh%40kmbl&pn=Prakash%Abmar&cu=INR";
            System.out.println(decode(u));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static String decode(String in) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < in.length(); i++) {
            char c = in.charAt(i);
            if (c == '%') {
                int decoded = Integer.parseInt(in.substring(i + 1, i + 3), 16);
                if (decoded >= 32 && decoded <= 126) { //Possible valid char
                    sb.append((char) decoded);
                    i += 2;
                } else { //not a valid char... maybe a space
                    sb.append(" ");
                }
            } else if (c == '+') {
                sb.append(" ");
            } else {
                sb.append(c);
            }
        }

        return sb.toString();
    }
}
Run Code Online (Sandbox Code Playgroud)

有很多可能性,因此您可能需要一个“定制”解决方案。上面的代码涵盖了一些情况。