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

Android 将UTF-8编码数据发送到服务器会丢失某些字符,android,xml,utf-8,special-characters,Android,Xml,Utf 8,Special Characters,我正在从事一个项目,其中包括服务器(JavaEE应用程序)和客户端(Android应用程序)的通信。XML作为HTTP请求的POST参数之一发送(名为“XML”)。还有一些我传递给服务器的其他POST参数,但为了简单起见,我在下面的函数中删除了它们。出现的问题是某些信件没有正确发送到服务器-例如字符Ű(请注意,这不是德语ࢠ,顺便说一句,这是正确发送的)。发送代码如下所示: 私有字符串postSyncXML(字符串XML){ 字符串url=”http://10.0.2.2:8080/DebugSe

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

私有字符串postSyncXML(字符串XML){
字符串url=”http://10.0.2.2:8080/DebugServlet/DebugServlet";
HttpClient HttpClient=新的DefaultHttpClient();
List nameValuePairs=新的ArrayList();
添加(新的BasicNameValuePair(“xml”,xml));
UrlEncodedFormEntity表单;
试一试{
表单=新的UrlEncodedFormEntity(nameValuePairs);
setContentEncoding(HTTP.UTF_8);
HttpPost HttpPost=新的HttpPost(url);
httppost.setEntity(表格);
HttpResponse response=(HttpResponse)httpclient.execute(httppost);
HttpEntity当前性=response.getEntity();
String resp=EntityUtils.toString(最近性);
Log.i(标记“postSyncXML srv响应:”+resp);
返回响应;
}捕获(不支持的编码异常e){
e、 printStackTrace();
}捕获(客户端协议例外e){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}
返回null;
}
我猜问题出在我用来设置XML作为POST参数之一的BasicNameValuePair中,它的文档说它使用US-ASCII字符集。发送UTF-8编码的POST字段的正确方式是什么

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

return finalString;

在您的post方法中的用户最终链接。

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

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

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

我也面临类似的问题。但为了验证它,我在下面写了两个JSP

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


-------------test2.jspx-----------------
输入的测试是request.getParameter(“u”)
----------------------------------
然后在第一个输入框中输入下面的重音字符 第五章:中国农业科技大学硕士研究生学位论文(二)中国农业科技大学硕士研究生学位论文(二)中国农业科技大学硕士研究生学位论文(三)中国农业科技大学硕士研究生学位论文(三)

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


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

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


   
     String en = request.getCharacterEncoding();
     if(en == null) {
      request.setCharacterEncoding("UTF-8");
     }
   
当你这样做的时候

form = new UrlEncodedFormEntity(nameValuePairs);
您需要像这样指定字符集

form = new UrlEncodedFormEntity(nameValuePairs,"UTF-8");
你可以去安卓开发者那里看看


使用默认编码为

的参数列表构造一个新的UrlEncodedFormEntity这是从Android发送UTF-8数据时遇到的问题。您的代码可以正常工作,但您必须将
字符串
编码为
Base64
。在PHP服务器上,您只需将
Base64
字符串解码回来。这对我有用。如果您需要代码,我可以与您分享。

您可以发布表单吗;在设置contentEncoding之后?它还可以用于获得nameValuePairs列表的完整打印输出。我认为,如果我们看一下这两个,我们可以看到问题所在。它不像使用form.toString()来获取内容的编码方式那样简单,但结果如下:不是将提到的字母编码为字节序列“C5 B0”,而是将其编码为“1A”。所以,表单似乎没有正确地编码这个字符……这个解决方案可以解决我的问题,试试这个:这是表单应该代替我做的部分。+1这是帮助我从Android向Heroku上的PHP脚本发送POST请求的原因,这些脚本与PostgreSQL一起工作。您必须确保数据以UTF-8编码,本解决方案就是这样做的。谢谢!如果我们只向服务器发送文本,那么这个解决方案可以正常工作,但是如果我们想发送图像,那么我们需要使用MultipartEntity。我正在使用下面的代码设置MultipartEntity中的编码,但它不起作用。新的MultiPartEntity(HttpMultipartMode.BROWSER_兼容,null,Charset.forName(“UTF-8”),新的MultiPartEntity.ProgressListener(){@Override public void transfer(long num){});
form = new UrlEncodedFormEntity(nameValuePairs,"UTF-8");