Android中的HttpPost - 无法识别字符

4

我正在尝试向一个servlet发送一条消息(包含英文和中文)。 如果我使用Java应用程序发布消息,它可以正常工作。

       public class PostText
       {
        public final static String HTTP_PORT = "...";

        public static void main(String[] args) throws Exception
        {
            String message = "...";
            System.out.println(post(message));
        }

        public static String post(String message)
        {

            HttpPost httpRequest = new HttpPost(HTTP_PORT);

            List<NameValuePair> params = new ArrayList<NameValuePair>();
            params.add(new BasicNameValuePair("input", message));

            try {
                httpRequest.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));

                org.apache.http.HttpResponse httpResponse = new DefaultHttpClient().execute(httpRequest);


                if (httpResponse.getStatusLine().getStatusCode() == 200) {

                    String strResult = EntityUtils.toString(httpResponse.getEntity());
                    return strResult;
                } else {
                    System.out.println(httpResponse.getStatusLine().getStatusCode());
                }
            } catch (ClientProtocolException e) {
               // ...
            } catch (UnsupportedEncodingException e) {

            } catch (IOException e) {
               // ...
            }
            return null;
        }
    } 

当我在Android中使用HttpPost时,服务器会收到无法识别的字符,比如“æ¸å大学”。我尝试使用HttpURLConnection发送消息,结果也包含无法识别的字符。Java应用程序中的HttpClient和Android应用程序中的HttpClient有什么区别?这太奇怪了。
非常感谢。

请看一下这个网址:https://dev59.com/v2nWa4cB1Zd3GeqP2qRc#ZmsFoYgBc1ULPQZF0dLj,它可能对你有用。 - G_S
谢谢。我已经尝试过了,但它仍然发布了无法识别的字符。我刚刚问了编写Servlet代码的人寻求帮助。他说字符编码是UTF-8,并将在今晚发送给我Servlet代码。也许当我得到代码时,我可以找到问题所在。我仍然想知道2个应用程序中的HttpPost之间有何区别... - zdzapple
如果你找到了解决方案,请确保发布它,以便对其他人有用。 - G_S
你可以回答自己的问题。这样至少它会被标记为已关闭。 - TJ Thind
好的 :) 这是我第一次使用stackoverflow。谢谢你提醒我。 - zdzapple
2个回答

1
问题已解决。我使用Wireshark捕获发送到服务器的数据包。Java应用程序中HttpClient的头文件为:
User-Agent: Apache-HttpClient/4.2.1(java 1.5)

在 Android 应用程序中,HttpClient 的头部是:

User-Agent: Apache-httpclient/unavailable (java 1.4)

我猜测Android中的HttpClient版本不是最新的。从Apache HttpClient 4.1下载了一个预编译的.jar库并将其用于我的项目中,问题得到解决。谢谢大家。


0

可能的差异在于Android处理字符串的方式。

如果您的源代码不是UTF-8,这可能会导致问题: String message = "...";

我建议将字符串外部化为

String message = myContext.getString(R.string.message);

谢谢。源代码和项目都是 UTF-8 编码的。我也尝试使用 new String(message.getBytes(), "UTF-8")),但它没有起作用 :( - zdzapple
非常不可能在传输过程中扭曲urlencoded(即ASCII)内容。所以:1)按建议尝试R.string 2)确实如此!3)将new UrlEncodedFormEntity(params,“UTF-8”)的输出保存到变量中,并在两个平台上比较其值4)对于params(所有组件中的字节)也是如此5)对于消息也是如此。您需要字节的数字值,而不是屏幕上显示的任何内容。转储它们,在调试器中查看它们。如果所有这些东西恰好相等,我会怀疑传输。 - full.stack.ex
谢谢。问题已解决。我尝试了一个更新的HttpClient版本。 - zdzapple

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接