Подтвердить что ты не робот

Опубликованные данные 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?

4b9b3361

Ответ 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 обратно. Это сработало для меня. Я могу поделиться, если вам нужен код.