Опубликованные данные UTF-8 на сервер теряют определенные символы
Я работаю над проектом, который включает в себя связь сервера (приложение JavaEE) и клиента (приложение для Android). XML отправляется как один из параметров POST HTTP-запроса (с именем "xml" ). Есть также несколько других параметров POST, которые я передаю серверу, но в функции ниже я удалил их для простоты. Возникает проблема в том, что некоторые буквы не доставляются на сервер надлежащим образом - например, символ Ű
(обратите внимание, что это не немецкий Ü
, который правильно доставлен, кстати). Код для отправки:
private String postSyncXML(String XML) {
String url = "http://10.0.2.2:8080/DebugServlet/DebugServlet";
HttpClient httpclient = new DefaultHttpClient();
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
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. Каков правильный способ отправки полей POST с кодировкой UTF-8?
Ответы
Ответ 1
После долгих исследований и попыток заставить все работать, я наконец нашел решение проблемы, это простое дополнение к существующему коду. Решение заключалось в использовании параметра "UTF-8" в конструкторе класса UrlEncodedFormEntity:
form = new UrlEncodedFormEntity(nameValuePairs,"UTF-8");
После этого изменения символы были закодированы и правильно доставлены на сервер.
Ответ 2
Когда вы выполните эту строку
form = new UrlEncodedFormEntity(nameValuePairs);
вам нужно указать кодировку следующим образом
form = new UrlEncodedFormEntity(nameValuePairs,"UTF-8");
Вы можете найти разработчика Android.
Создает новый UrlEncodedFormEntity со списком параметров со стандартным кодированием DEFAULT_CONTENT_CHARSET
Ответ 3
String finalString = URLEncoder.encode(request, "UTF-8");
return finalString;
user finalString в методе post.
Ответ 4
Или я могу добавить ниже код в scriptlet в верхней части моего test2.jspx, который решит проблему.
String en = request.getCharacterEncoding();
if(en == null) {
request.setCharacterEncoding("UTF-8");
}
Ответ 5
Я также столкнулся с подобной проблемой. Но чтобы проверить это, я написал ниже два JSP
------------- test1.jspx -----------------
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:jsp="http://java.sun.com/JSP/Page" version="2.0">
<jsp:directive.page contentType="text/html; charset=utf-8"/>
<body>
<form action="/test2.jspx" method="POST" accept-charset="UTF-8">
<input type="text" name="u" id="u" />
<input type="submit" value="Login3" />
</form>
</body>
</html>
-------------test2.jspx-----------------
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:jsp="http://java.sun.com/JSP/Page" version="2.0">
<jsp:directive.page contentType="text/html; charset=utf-8"/>
<body>
The test entered is <jsp:expression>request.getParameter("u")</jsp:expression>
</body>
</html>
----------------------------------
И затем введите ниже акцентированные символы в первом поле ввода
ÂÃÄÀÁÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿ
И ясно видно, что браузер Android не может обрабатывать кодировку UTF-8
в параметрах POST.
Я думаю, мне нужно будет использовать метод GET и вам нужно будет добавить "URIEncoding = UTF-8" для коннектора в tomcat server.xml.
Ответ 6
Это была проблема отправки данных UTF-8 с Android. Ваш код будет работать отлично, за исключением того, что вам нужно будет закодировать ваш String
до Base64
. На сервере PHP вы просто декодируете Base64
String обратно. Это сработало для меня. Я могу поделиться, если вам нужен код.