【问题标题】:URL Encode and Decode Special character in JavaJava中的URL编码和解码特殊字符
【发布时间】:2011-01-30 05:24:19
【问题描述】:

在 Java 中,我需要使用 HTTP Post 向服务器发送请求,但如果 URL 的参数中包含一些特殊字符,则会抛出异常

java.lang.IllegalArgumentException: URLDecoder:非法十六进制字符 转义 (%) 模式 - 对于输入字符串: "&'"

发送数据的代码

DefaultHttpClient httpclient = new DefaultHttpClient(); 
   HttpPost httpPost = new HttpPost(URL); 

   String sessionId = RequestUtil.getRequest().getSession().getId();
   String data = arg.getData().toString();

   List<NameValuePair> params = new ArrayList<NameValuePair>();   
   params.add(new BasicNameValuePair(param1, data));
   params.add(new BasicNameValuePair(param2, sessionId));
         httpPost.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));           

   HttpResponse response = (HttpResponse) httpclient.execute(httpPost);

在服务器端,我使用下面的代码来读取信息

 String data = request.getParameter(param1);
   if (data != null) {
    actionArg = new ChannelArg(URLDecoder.decode(data, "UTF-8"));
   }

代码工作正常,但如果我输入一些特殊字符,如 [aああ#$%&'(?/.,あああああ],它会抛出异常。我想知道是否有人可以帮助我提示能够编码和解码特殊字符吗?

非常感谢您。

【问题讨论】:

    标签: java urlencode


    【解决方案1】:

    对文本进行编码以便安全通过互联网:

    import java.net.*;
    ...
    try {
        encodedValue= URLEncoder.encode(rawValue, "UTF-8");
    } catch (UnsupportedEncodingException uee) { }
    

    并解码:

    try {
        decodedValue = URLDecoder.decode(rawValue, "UTF-8");
    } catch (UnsupportedEncodingException uee) { }
    

    【讨论】:

    • 感谢 Steven,但正如您在我的代码中看到的,我在客户端使用 UrlEncodedFormEntity(params, "UTF-8") 来编码我的对象数据,在服务器端,我使用 URLDecoder.decode (数据,“UTF-8”)进行解码。它适用于日文字符,但问题仅在我输入一些字符时出现,例如 [#$%&'(?/.,]
    【解决方案2】:

    遗憾的是 url 编码器无法解决您的问题。我遇到了这个问题并使用了自定义实用程序。我记得这是我从谷歌搜索得到的;)。

    http://www.javapractices.com/topic/TopicAction.do?Id=96

    【讨论】:

    • 我监督了一个更好的解决方案。我们来自 apache 的朋友有 StringEscapeUtils (org.apache.commons.lang.StringEscapeUtils)。请检查它是否有效。
    【解决方案3】:
    String data = request.getParameter(param1);
    

    如果这是servlet API,则参数已经被解码。无需进一步处理百分比编码。


    我没有使用过 HttpClient,但请确保它在标头中发送编码:

    Content-type: application/x-www-form-urlencoded; charset=UTF-8
    

    或者,如果必须,在任何 getParameter 调用之前设置已知编码:

    request.setCharacterEncoding("UTF-8");
    

    【讨论】:

    • 那是金子!非常感谢
    【解决方案4】:

    试试番石榴

    使用 com.google.common.net.UrlEscapers

    中文很好用

    像这样:

    Escaper escaper = UrlEscapers.urlFragmentEscaper();
    String result = escaper.escape(yoururl);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-09
      • 1970-01-01
      • 2014-03-31
      • 1970-01-01
      • 1970-01-01
      • 2017-09-21
      • 1970-01-01
      • 2014-09-17
      相关资源
      最近更新 更多