首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >发送带有特殊字符的http post/put - Problems时的Android默认字符集

发送带有特殊字符的http post/put - Problems时的Android默认字符集
EN

Stack Overflow用户
提问于 2011-06-03 21:31:43
回答 3查看 31.5K关注 0票数 18

我对apache httpClient进行了如下配置:

代码语言:javascript
复制
HttpProtocolParams.setContentCharset(httpParameters, "UTF-8");
HttpProtocolParams.setHttpElementCharset(httpParameters, "UTF-8");

我还为所有http post和put请求包含了http头文件"Content-Type: application/json;charset=UTF-8“。

我正在尝试使用包含特殊字符的json正文发送http post/put请求。通过Google拼音键盘、符号等输入中文字符)这些字符在日志中显示为胡言乱语,但我认为这是因为DDMS不支持UTF-8,如this问题所述。

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

我还尝试在单个字段中放置250个非ascii字符,因为该特定字段最多可以包含250个字符。但是,它无法在服务器端进行验证,因为服务器端声称已超过250个字符的限制。250个ASCII字符可以很好地工作。

服务端的家伙们声称他们支持UTF-8。他们甚至尝试模拟一个包含中文字符的post请求,服务器可以很好地接收数据。然而,这个人(一个中国人)使用的是一台安装了中文语言包的Windows计算机(我想,因为他可以在键盘上输入中文字符)。

我猜Android客户端和服务器(由中国人制造)使用的字符集是不一致的。但我不知道哪一个是错误的,因为服务器的家伙们声称他们支持UTF-8,而我们的rest客户端被配置为支持UTF-8。

这让我想知道Android在所有文本输入中默认使用什么字符集,是否可以通过编程将其更改为不同的字符集。我试图找到关于如何在输入小部件上做到这一点的资源,但我没有找到任何有用的东西。

有没有办法为Android中的所有输入小部件设置字符集?或者也许我在rest客户端配置中遗漏了一些东西?或者,仅仅是可能,服务器的家伙没有在他们的服务器上使用UTF-8,而是使用Windows字符集?

EN

回答 3

Stack Overflow用户

发布于 2011-11-08 05:29:26

我知道这篇文章有点老了,但是这里有一个解决方案:

下面是我将UTF-8字符串(不管是xml、soap还是json)发送到服务器的代码。我尝试使用西里尔字母、哈希值和其他一些特殊字符,它就像一个护身符。这是我通过论坛找到的许多解决方案的汇编。

代码语言:javascript
复制
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();

我希望有人会发现这段代码很有帮助。:)

票数 13
EN

Stack Overflow用户

发布于 2014-06-03 21:53:21

应将字符串实体的字符集设置为UTF-8:

代码语言:javascript
复制
StringEntity stringEntity = new StringEntity(urlParameters, HTTP.UTF_8);
票数 5
EN

Stack Overflow用户

发布于 2011-06-03 21:38:16

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

确保以字节形式发送内容正文。将来自Android的HTTP请求与成功的curl请求的输出进行比较。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6227747

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档