将UTF-8编码的数据发布到服务器会丢失某些字符
我正在从事包括服务器(JavaEE应用程序)和客户端(Android应用程序)通信的项目。 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 nameValuePairs = new ArrayList();
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;
}
我的猜测是问题出在BasicNameValuePair中,我用于将XML设置为POST参数之一,并且其文档说它使用US-ASCII字符集。 发送UTF-8编码的POST字段的正确方法是什么?
6个解决方案
100 votes
经过大量研究并尝试使事情正常进行,我终于找到了解决该问题的方法,它是对现有代码的简单补充。 解决方案是在UrlEncodedFormEntity类构造函数中使用参数“ UTF-8”:
form = new UrlEncodedFormEntity(nameValuePairs,"UTF-8");
更改之后,字符被编码并正确地传递到服务器端。
dstefanox answered 2020-08-10T07:37:24Z
21 votes
当你做这行
form = new UrlEncodedFormEntity(nameValuePairs);
您需要像这样指定字符集
form = new UrlEncodedFormEntity(nameValuePairs,"UTF-8");
您可以转到Android Developer进行查找。
使用默认列表DEFAULT_CONTENT_CHARSET的参数列表构造一个新的UrlEncodedFormEntity
BobGao answered 2020-08-10T07:37:58Z
3 votes
String finalString = URLEncoder.encode(request, "UTF-8");
return finalString;
用户postString在您的post方法中。
AZ_ answered 2020-08-10T07:38:18Z
1 votes
或者,我可以在test2.jspx顶部的scriptlet中添加以下代码,以解决该问题
String en = request.getCharacterEncoding();
if(en == null) {
request.setCharacterEncoding("UTF-8");
}
Amol Gaikwad answered 2020-08-10T07:38:38Z
0 votes
我也面临类似的问题。 但是为了验证这一点,我在下面编写了两个JSP
------------- test1.jspx -----------------
xmlns:jsp="http://java.sun.com/JSP/Page" version="2.0">
-------------test2.jspx-----------------
xmlns:jsp="http://java.sun.com/JSP/Page" version="2.0">
The test entered is request.getParameter("u")
----------------------------------
然后在第一个输入框中的重音字符下方输入墨西哥
这个问题很明显,Android浏览器无法处理UTF-8编码在POST参数中。
我认为,我将需要使用GET方法,并且需要为tomcat server.xml中的连接器添加“ URIEncoding = UTF-8”。
Amol Gaikwad answered 2020-08-10T07:39:16Z
0 votes
这是从Android发送UTF-8数据时遇到的问题。 您的代码可以正常工作,除了必须将3004924734221051059072编码为Base64之外。 在服务器PHP上,您只需解码回Base64字符串即可。 它为我工作。 如果您需要代码,我可以分享。
Mukund K Roy answered 2020-08-10T07:39:36Z