Android默认字符集时发送http post / put – 具有特殊字符的问题

我已经configuration了Apache httpClient,如下所示:

HttpProtocolParams.setContentCharset(httpParameters, "UTF-8"); HttpProtocolParams.setHttpElementCharset(httpParameters, "UTF-8"); 

对于所有http post和put请求,我还包含http头“Content-Type:application / json; charset = UTF-8”。

我正在尝试使用包含特殊字符(即通过Google拼音键盘,符号等的中文字符)的json正文发送http post / put请求。字符在日志中显示为乱码,但是我认为这是因为DDMS会不支持UTF-8,正如这个问题所描述的那样。

问题是当服务器收到请求时,它有时看不到字符(尤其是中文字符),或者当我们通过GET请求检索时,它变得毫无意义的垃圾。

我也试过把250个非ASCII字符放在一个字段中,因为这个字段最多可以容纳250个字符。 但是,在服务器端没有validation超过250个字符的限制。 250个ASCII字符工作得很好。

服务器帅哥声称他们支持UTF-8。 他们甚至试图模拟一个包含中文字符的发布请求,并且服务器收到的数据就好了。 然而,这个家伙(一个中国人)正在使用安装了中文语言包的Windows电脑(我想,因为他可以在他的键盘上input中文字符)。

我猜测Android客户端和服务器使用的字符集(由中国人制作的btw)没有alignment。 但是我不知道哪个服务器出了问题,因为服务器支持者声称他们支持UTF-8,而我们的其他客户端configuration为支持UTF-8。

这让我想知道在所有的文本input默认情况下Android使用的字符集,如果它可以编程更改为不同的。 我试图find关于如何在input小部件上这样做的资源,但我没有find任何有用的东西。

有没有一种方法来设置Android中的所有input小部件的字符集? 或者,也许我错过了其他客户端configuration中的东西? 或者,也许,也许,服务器的兄弟们没有在他们的服务器上使用UTF-8,而是使用Windows的字符集呢?

Solutions Collecting From Web of "Android默认字符集时发送http post / put – 具有特殊字符的问题"

显然,我忘了将StringEntity的字符集设置为UTF-8。 这些线路的诀窍是:

  httpPut.setEntity(new StringEntity(body, HTTP.UTF_8)); httpPost.setEntity(new StringEntity(body, HTTP.UTF_8)); 

因此,在发送非ASCII字符的http文章时,至less有两个级别可以设置Android客户端的字符集。

  1. 其余的客户端本身
  2. StringEntity

更新:正如塞缪尔在评论中指出的那样,现代的做法是使用ContentType,如下所示:

  final StringEntity se = new StringEntity(body, ContentType.APPLICATION_JSON); httpPut.setEntity(se); 

我知道这个post是有点老,但不过这里是一个解决scheme:

这里是我的代码发布UTF-8string(这是无关紧要,如果他们是XML肥皂或JSON)到服务器。 我用西里尔文,哈希值和一些其他特殊字符尝试它,它的作品就像一个魅力。 这是我通过论坛find的许多解决scheme的汇编。

 HttpParams httpParameters = new BasicHttpParams(); HttpProtocolParams.setContentCharset(httpParameters, HTTP.UTF_8); HttpProtocolParams.setHttpElementCharset(httpParameters, HTTP.UTF_8); HttpClient client = new DefaultHttpClient(httpParameters); client.getParams().setParameter("http.protocol.version", HttpVersion.HTTP_1_1); client.getParams().setParameter("http.socket.timeout", new Integer(2000)); client.getParams().setParameter("http.protocol.content-charset", HTTP.UTF_8); httpParameters.setBooleanParameter("http.protocol.expect-continue", false); HttpPost request = new HttpPost("http://www.server.com/some_script.php?sid=" + String.valueOf(Math.random())); request.getParams().setParameter("http.socket.timeout", new Integer(5000)); List<NameValuePair> postParameters = new ArrayList<NameValuePair>(); // you get this later in php with $_POST['value_name'] postParameters.add(new BasicNameValuePair("value_name", "value_val")); UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(postParameters, HTTP.UTF_8); request.setEntity(formEntity); HttpResponse response = client.execute(request); in = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); StringBuffer sb = new StringBuffer(""); String line = ""; String lineSeparator = System.getProperty("line.separator"); while ((line = in.readLine()) != null) { sb.append(line); sb.append(lineSeparator); } in.close(); String result = sb.toString(); 

我希望有人会发现这个代码有帮助。 🙂

你应该把string实体的字符集设置为UTF-8:

 StringEntity stringEntity = new StringEntity(urlParameters, HTTP.UTF_8); 

您可以通过使用curl发送相同的数据来消除服务器的问题。 如果它使用curl use --trace来检查输出。

确保您以字节的forms发送内容正文。 比较来自Android的HTTP请求和成功的curl请求的输出。