将UTF-8编码数据发布到服务器会丢失某些字符

时间:2011-03-11 08:28:26

标签: android xml utf-8 special-characters

我正在开发的项目包括服务器(JavaEE app)和客户端(Android app)的通信。 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; } 。发送代码如下:

{{1}}

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

6 个答案:

答案 0 :(得分:100)

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

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

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

答案 1 :(得分:21)

当你这样做时

form = new UrlEncodedFormEntity(nameValuePairs);

你需要像这样指定字符集

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

您可以访问Android Developer了解。

使用默认编码为DEFAULT_CONTENT_CHARSET

的参数列表构造一个新的UrlEncodedFormEntity

答案 2 :(得分:3)

String finalString = URLEncoder.encode(request, "UTF-8");

return finalString;

post方法中的用户finalString。

答案 3 :(得分:1)

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


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

答案 4 :(得分:0)

我也遇到过类似的问题。但为了验证它,我在下面写了两个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”。

答案 5 :(得分:0)

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