Отправка данных в кодировке UTF-8 на сервер теряет определенные символы - PullRequest
42 голосов
/ 11 марта 2011

Я работаю над проектом, который включает взаимодействие сервера (приложение 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?

Ответы [ 6 ]

100 голосов
/ 13 марта 2011

После долгих исследований и попыток заставить все работать, я наконец нашел решение этой проблемы, которое является простым дополнением к существующему коду. Решением было использование параметра "UTF-8" в конструкторе класса UrlEncodedFormEntity:

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

После этого изменения символы были закодированы и правильно доставлены на сервер.

21 голосов
/ 12 июля 2012

Когда вы делаете эту строку

form = new UrlEncodedFormEntity(nameValuePairs);

вам нужно указать кодировку следующим образом

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

Вы можете узнать об Android Developer.

Создает новый UrlEncodedFormEntity со списком параметров со кодировкой по умолчанию DEFAULT_CONTENT_CHARSET

3 голосов
/ 11 марта 2011
String finalString = URLEncoder.encode(request, "UTF-8");

return finalString;

user finalString в вашем методе записи.

1 голос
/ 22 марта 2011

Или я могу добавить приведенный ниже код в скриптлет вверху моего test2.jspx, который решит проблему


   
     String en = request.getCharacterEncoding();
     if(en == null) {
      request.setCharacterEncoding("UTF-8");
     }
   
0 голосов
/ 30 ноября 2012

Это была проблема при отправке данных UTF-8 из Android.Ваш код будет работать нормально, за исключением того, что вам придется кодировать ваш String в Base64.На сервере PHP вы просто декодируете Base64 String назад.Это сработало для меня.Я могу поделиться, если вам нужен код.

0 голосов
/ 18 марта 2011

Я тоже сталкивался с подобной проблемой. Но чтобы проверить это, я написал ниже две 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.

...