【问题标题】:sending '+' character utf-8, java App to servlet [duplicate]发送'+'字符utf-8,java App到servlet [重复]
【发布时间】:2016-06-26 01:32:05
【问题描述】:

我正在尝试编写一个包含此类字符串的字节缓冲区 &field_Value=

kggsW9YizUuRpjB/RtppZImnC8SekMGAWGnCmw+wPMwn7fWJva0QbSK/Slt/DDsZ

通过 HttpURLConnection,但我收到 &field_Value=

kggsW9YizUuRpjB/RtppZImnC8SekMGAWGnCmw wPMwn7fWJva0QbSK/Slt/DDsZ

所以“+”是唯一不发送的字符。它发生在我所有包含“+”的字符串中。

您能告诉我如何对字符串进行编码或我做错了什么吗?

这是我的代码:

发件人:

url = new URL(url_globalApp);
        connection = (HttpURLConnection)url.openConnection();
        connection.setRequestMethod("POST");
        connection.setRequestProperty("Content-Type","application/x-www-form-urlencoded");

        connection.setRequestProperty("Content-Language", "en-US");  
        connection.setRequestProperty("Accept-Charset", "UTF-8"); 
        connection.setUseCaches (false);
        connection.setDoInput(true);
        connection.setDoOutput(true);

        //Send request
        DataOutputStream wr = new DataOutputStream (
                connection.getOutputStream ());
        //**************** first try ************//
        wr.write(pairs_1.getBytes("UTF-8"), 0, pairs_1.length());

        //**************** second try ************//
            //wr.writeBytes(new String(pairs_1.getBytes(),"UTF-8"));

        //**************** third try ************//
            //wr.writeUTF(pairs_1);
            wr.flush ();
            wr.close ();

小服务程序:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    request.setCharacterEncoding("UTF-8");
    Map <String,String[]> parameters = request.getParameterMap();
    System.out.println(parameters.get("field_value_1")[0]);

【问题讨论】:

  • URLEncode +;这是' ' 的编码。
  • 是的,我注意到了。我必须成为“+”中的“”吗?还有其他解决方案吗?我会在这个 servlet 中收到很多信息。
  • 可以使用URLEncoder.encode(String)对整个String进行编码。
  • 谢谢,这是正确的编码方式,但是当我尝试获取参数 Map 时,它不起作用。至少字符串在服务器端是可以的。

标签: java servlets utf-8 httpurlconnection


【解决方案1】:

查询参数的值必须经过 URL 编码。

网址编码

kggsW9YizUuRpjB/RtppZImnC8SekMGAWGnCmw+wPMwn7fWJva0QbSK/Slt/DDsZ

kggsW9YizUuRpjB%2FRtppZImnC8SekMGAWGnCmw%2BwPMwn7fWJva0QbSK%2FSlt%2FDDsZ

注意/ 是如何编码为%2F,而+ 是如何编码为%2B

你可以通过调用来做到这一点

java.net.URLEncoder.encode("kggsW9YizUuRpjB/RtppZImnC8SekMGAWGnCmw+wPMwn7fWJva0QbSK/Slt/DDsZ", "UTF-8")

【讨论】:

  • 谢谢,这是正确的编码方式,但是当我尝试获取参数 Map 时,它不起作用。至少字符串在服务器端是可以的。有没有办法获取参数Map?
  • @SergioBaquero “不起作用”是什么意思?地图是空的吗? request.getQueryString() 的值是多少?
  • 是的,当我运行 parameters.containsKey("field_"+String.valueOf(i)) 时,它返回 false,就在请求被编码时。
  • @SergioBaquero 如果您不回答我的实际问题,我无能为力。
  • 对不起,我没看到,请给我一秒钟
猜你喜欢
  • 2012-03-25
  • 2019-01-09
  • 1970-01-01
  • 1970-01-01
  • 2016-03-26
  • 2015-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多