在Java中转义保留的url参数

时间:2015-06-20 01:09:51

标签: java android

我正在构建一个Android应用程序,我需要将应用程序的一部分发布到包含一些表单数据的网址。我传递的表单字段之一是电子邮件地址。

我注意到一个问题,其中一些电子邮件地址中有一个“+”符号,这是URL中的保留字符,意思是''。我想知道,在将其转换为post byte []之前,我如何在代码中清理/转义此类字符和其他字符。我不想做一个replaceAll。是否有一个内置于Java中的特定编码器可以执行此操作?

以下是我使用的代码:

StringBuilder builder = new StringBuilder();
builder.append(ID + "=" + params.id + "&");
builder.append(LOCALE + "=" + params.locale + "&");
builder.append(EMAIL + "=" + params.getEmail());

String encodedParams = builder.toString();
mWebView.postUrl(URL, EncodingUtils.getAsciiBytes(encodedParams));

2 个答案:

答案 0 :(得分:2)

尝试使用java.net.URLEncoder.encode(valueToEncode," UTF-8");

自从我查看了详细信息以来已经有一段时间了,但我相信在连接它们之前必须在字符串的各个部分调用encode()。

下面的实用方法对我来说效果很好:

    /**
     * Given a {@link Map} of keys and values, this method will return a string
     * that represents the key-value pairs in
     * 'application/x-www-form-urlencoded' MIME format.
     * 
     * @param keysAndValues
     *            the keys and values
     * @return the data in 'application/x-www-form-urlencoded' MIME format
     */
    private String wwwFormUrlEncode(Map<String, String> keysAndValues) {
        try {
            StringBuilder sb = new StringBuilder();
            boolean isFirstEntry = true;
            for (Map.Entry<String, String> argument : keysAndValues.entrySet()) {
                if (isFirstEntry) {
                    isFirstEntry = false;
                } else {
                    sb.append("&");
                }
                sb.append(URLEncoder.encode(argument.getKey(), "UTF-8"));
                sb.append("=");
                sb.append(URLEncoder.encode(argument.getValue(), "UTF-8"));
            }
            return sb.toString();
        } catch (UnsupportedEncodingException e) {
            //it is unlikely that the system does not support UTF-8 encoding, 
            //so we will not bother polluting the method's interface with a checked exception
            throw new RuntimeException(e); 
        }
    }

答案 1 :(得分:0)

用%2b替换加号。你必须编码它才能在url中使用它,否则它将被视为空格。然后在你的服务器端你可以html解码电子邮件。