HTTP-сообщение Android отправляется с другой кодировкой набора символов

У меня проблема: сделать http-пост на Android с немецким «umlaute» äöü. Я передаю объект json методу ниже и выполняю возвращенный ClientResource с сообщением и объектом запроса в возвращенном ответе клиента. Когда я хочу опубликовать что-то вроде { "foo": "bär" }, HttpClient отправляет что-то вроде { "foo": "b√§r" }.

Не знаю почему. Что я делаю не так.

public static ClientResource newPostRequest(Context context, String urn,
        JSONObject form) throws MissingAccessTokenException {

    ClientResource resource = new ClientResource(uri + urn);

    StringRepresentation sr = new StringRepresentation(form.toString());
    sr.setMediaType(MediaType.APPLICATION_JSON);

    resource.getRequest().setEntity(sr);

    return resource;
}

Обновить

Я использовал http-клиент Android по умолчанию (который, как я полагаю, является http-клиентом apache) и получил ту же ошибку. Так что проблема может быть здесь. Я пытаюсь реализовать другой парсер json (в настоящее время gson) и (если возможно) другой http-клиент. Вернуться позднее...

Обновить

Гсон не проблема. Я добавил строку json в StringRepresentation, и ничего не изменилось.

ОТВЕТ

Ну, это странно. Может быть, кто-то может прояснить это для меня. Я всегда спрашивал себя, почему используется √§, и понял, что перевод utf-8 ä приводит к √§. Очевидно, мой телефон Android не использовал макроман, но мой Mac использовал. Поэтому я изменил кодировку текстового файла в eclipse, перезапустил eclipse и сервер tomcat, и это сработало. Тем не менее монитор TCP / IP в eclipse использует mac roman, который выглядит по-прежнему неправильно. Таким образом, это была проблема с моим сервером, а не с рестлет-клиентом на андроиде. Я просто не мог этого увидеть, потому что монитор TCP/IP все закодировал в макромане.


person Stefan    schedule 27.06.2012    source источник


Ответы (1)


вы пытались вызвать setCharacterSet(...) на вашем StringRepresentation? например.,

StringRepresentation sr = new StringRepresentation(form.toString());
sr.setCharacterSet(CharacterSet.UTF_8);
person Jeffrey Blattman    schedule 27.06.2012
comment
во-первых, вы упомянули HttpClient, но используете Restlet. Вы можете объяснить? во-вторых, как вы определили, что эти данные отправляются неправильно, а не неправильно декодируются на сервере? - person Jeffrey Blattman; 27.06.2012
comment
Разве Restlet не использует DefaultHttpClient на Android? Я начал отслеживать порт сервера на наличие входящих запросов, так я определил, что клиент отправил. - person Stefan; 28.06.2012
comment
restlet может использовать HttpClient, но он не обязательно использует его (похоже, что в вашем случае он его использует). независимо от того, поскольку вы используете интерфейсы рестлета, вам нужно будет решить проблему в контексте рестлета. - person Jeffrey Blattman; 28.06.2012