【问题标题】:Post UTF-8 encoded data to server loses certain characters将 UTF-8 编码数据发布到服务器会丢失某些字符
【发布时间】:2023-03-26 15:30:01
【问题描述】:

我正在从事的项目包括服务器(JavaEE 应用程序)和客户端(Android 应用程序)的通信。 XML 作为 HTTP 请求的 POST 参数之一发送(名为“xml”)。我传递给服务器的其他 POST 参数也很少,但在下面的函数中,为了简单起见,我删除了它们。出现的问题是某些字母没有正确传递到服务器 - 例如字符Ű(注意这不是德语Ü,顺便说一下,它是正确传递的)。发送代码如下:

private String postSyncXML(String XML) {
    String url = "http://10.0.2.2:8080/DebugServlet/DebugServlet";
    HttpClient httpclient = new DefaultHttpClient();  

    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
    nameValuePairs.add(new BasicNameValuePair("xml",XML));

    UrlEncodedFormEntity form;
    try {
        form = new UrlEncodedFormEntity(nameValuePairs);
                form.setContentEncoding(HTTP.UTF_8);
        HttpPost httppost = new HttpPost(url);

        httppost.setEntity(form);

        HttpResponse response = (HttpResponse) httpclient .execute(httppost);
        HttpEntity resEntity = response.getEntity();  
        String resp = EntityUtils.toString(resEntity);
        Log.i(TAG,"postSyncXML srv response:"+resp);
        return resp;
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;
}

我的猜测是问题出在我用来将 XML 设置为 POST 参数之一的 BasicNameValuePair 中,并且它的文档说它使用 US-ASCII 字符集。发送 UTF-8 编码的 POST 字段的正确方法是什么?

【问题讨论】:

  • 能否请您发布 form.toString();设置 contentEncoding 后?获得 nameValuePairs 列表的完整打印输出也很有用。我想如果我们看看这两个,我们就能看出问题所在。
  • 它不像使用 form.toString() 来获取内容的编码方式那么简单,但结果如下:不是将提到的字母编码为字节序列“C5 B0”,而是编码作为“1A”。所以,似乎表单没有正确编码这个字符......
  • 这个解决方案可以解决我的问题,试试这个:stackoverflow.com/a/6228377/1929078

标签: android xml utf-8 special-characters


【解决方案1】:
String finalString = URLEncoder.encode(request, "UTF-8");

return finalString;

您的 post 方法中的用户 finalString。

【讨论】:

  • 这是表单应该代替我做的部分。
【解决方案2】:

经过大量研究和尝试使事情正常进行,我终于找到了解决问题的方法,即对现有代码进行简单的添加。解决方案是在 UrlEncodedFormEntity 类构造函数中使用参数“UTF-8”:

form = new UrlEncodedFormEntity(nameValuePairs,"UTF-8");

在此更改之后,字符被编码并正确传送到服务器端。

【讨论】:

  • +1 在将 POST 请求从 Android 发送到 Heroku 上与 PostgreSQL 一起使用的 PHP 脚本时,这对我有帮助。您必须确保数据以 UTF-8 编码,此解决方案就是这样做的。非常感谢!
  • 如果我们只向服务器发送文本,这个解决方案可以正常工作,但如果我们想发送图像,那么我们需要使用 MultipartEntity。我正在使用下面的代码在 MultipartEntity 中设置编码,但它不起作用。 new MultiPartEntity(HttpMultipartMode.BROWSER_COMPATIBLE, null, Charset.forName("UTF-8"), new MultiPartEntity.ProgressListener() { @Override public void transfer(long num) { } });
【解决方案3】:

我也遇到过类似的问题。但是为了验证,我在下面写了两个JSP

----------test1.jspx-----------------

<html xmlns="http://www.w3.org/1999/xhtml"
 xmlns:jsp="http://java.sun.com/JSP/Page" version="2.0">
  <jsp:directive.page contentType="text/html; charset=utf-8"/>
<body>
      <form action="/test2.jspx" method="POST" accept-charset="UTF-8">
                            <input type="text" name="u" id="u" />
                            <input type="submit" value="Login3" />
    </form>
</body>
</html>

-------------test2.jspx-----------------
<html xmlns="http://www.w3.org/1999/xhtml" 
xmlns:jsp="http://java.sun.com/JSP/Page" version="2.0">

<jsp:directive.page contentType="text/html; charset=utf-8"/>
<body>
    The test entered is <jsp:expression>request.getParameter("u")</jsp:expression>
</body>
</html>
----------------------------------

然后在第一个输入框的重音字符下方输入 ÂÃÄÀÁÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáââãääåæçèéêëìíîïïðñòóôõöøùúûüýþÿ

而且问题很明显,Android 浏览器无法处理 UTF-8 编码 在 POST 参数中。

我想,我需要使用 GET 方法,并且需要在 tomcat server.xml 中为连接器添加“URIEncoding=UTF-8”。

【讨论】:

    【解决方案4】:

    或者我可以在 test2.jspx 顶部的 scriptlet 中添加以下代码,这将解决问题

    
       
         String en = request.getCharacterEncoding();
         if(en == null) {
          request.setCharacterEncoding("UTF-8");
         }
       
    

    【讨论】:

      【解决方案5】:

      当你这样做时

      form = new UrlEncodedFormEntity(nameValuePairs);
      

      你需要像这样指定字符集

      form = new UrlEncodedFormEntity(nameValuePairs,"UTF-8");
      

      你可以去Android Developer了解一下。

      用默认编码DEFAULT_CONTENT_CHARSET的参数列表构造一个新的UrlEncodedFormEntity

      【讨论】:

        【解决方案6】:

        这是从 Android 发送 UTF-8 数据的问题。您的代码可以正常工作,只是您必须将 String 编码为 Base64 。在服务器 PHP 中,您只需将 Base64 字符串解码回来。它对我有用。如果你需要代码,我可以分享。

        【讨论】:

          猜你喜欢
          • 2016-07-18
          • 1970-01-01
          • 1970-01-01
          • 2015-08-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-07-31
          相关资源
          最近更新 更多