Как узнать, использует ли мой HTTP-запрос кодировку UTF-8?

Я пытаюсь решить проблему в приложении для Android. Приложение отправляет HTTP-запрос веб-службе. Когда текст в запросе содержит шведские символы Å, Å и Ö, это не работает. Люди, у которых есть веб-сервис, говорят, что это потому, что запрос должен быть закодирован в UTF-8, а они говорят, что это не так.

Приложение использует org.apache.http.impl.client.DefaultHttpClient, и я предполагаю, что эта строка говорит о том, что следует использовать UTF-8: HttpProtocolParams.setContentCharset(params, "UTF-8");

Я использовал Wireshark, чтобы увидеть, что отправляет приложение, и строка «TeståäöÅÄÖéüà» отображается как: «Test\345\344\366\305\304\326\351\374\340».

Я узнал по этой таблице, что числа представляют собой восьмеричное представление "кодовой точки Unicode" для персонажи. Это что-то другое, чем UTF-8, верно?

Так ли это, что если бы это было UTF-8, специальные символы были бы представлены двумя байтами, например. "c3 a5" для "å" и "c3 a4" для "ä"?

Итак:
1. Правильно ли я понимаю Unicode vs UTF-8?
2. Правильно ли я понимаю, что то, что отправляется НЕ в кодировке UTF-8?
3. Как мне это сделать? заставить DefaultHttpClient отправлять в UTF-8?

Джон


person prograde    schedule 11.05.2011    source источник
comment
Вы говорите о UTF-8 в URL-адресе запроса (например, в части «запрос») или в теле запроса?   -  person Stephen C    schedule 11.05.2011
comment
Я думаю, в теле. Откуда я знаю?   -  person prograde    schedule 11.05.2011


Ответы (1)


Как указал Стивен, вы должны различать кодировку, используемую в заголовке http (для URL-адреса), и в теле запроса.

В любом случае, различие не между Unicode и UTF-8 , UTF-8 - это одна из кодировок для UNICODE (UTF-16 - другая).

И вы, по-видимому, используете не Unicode, а старый Latin1 (ISO 8859-1): один байт для каждого символа. Так получилось, что первые 128 кодовых точек Unicode совпадают (примерно) с позициями, используемыми Latin1.

Сделайте себе одолжение и прочитайте основы Unicode. Это займет у вас один или два дня. , это очень ценные и нужные знания для любого программиста сегодня (и завтра).

person leonbloy    schedule 11.05.2011
comment
В HTTP POST вещи, которые я публикую, помещаются в тело, верно? Если я не ошибся :) - person prograde; 11.05.2011
comment
Спасибо, приятно знать, что это ISO 8859-1! Я сегодня пару часов читал про юникод, но я все еще совсем запутался, но я понимаю, что UTF-8 — это один из многих способов кодирования юникода, поэтому я признаю, что выразился небрежно :) Но все же , я прав, что я бы увидел c3 a5 для å в журнале, если бы он был в кодировке UTF-8? И как сделать, чтобы кодировка UTF-8 была в java? Что сделал HttpProtocolParams.setContentCharset(params, UTF-8)? - person prograde; 11.05.2011
comment
Вы должны найти байты c3 a5 в кодировке UTF-8, да (проверьте это, закодировав текстовый файл в utf8, сохраните его и посмотрите в шестнадцатеричном формате) - person leonbloy; 11.05.2011
comment
Java внутренне обрабатывает строки как строки, а не как байты. Только когда вы конвертируете их в байты (для сохранения в файл или отправки в сеть) вы должны указать кодировку набора символов. Это, в общем. Я мало знаю о HttpProtocolParams или DefaultHttpClient. - person leonbloy; 11.05.2011
comment
возможно это помогает? stackoverflow.com/questions/4989743/ - person leonbloy; 11.05.2011
comment
Спасибо, leonbloy, за ссылку на запись в блоге Joel on Software. Это очень хорошо! Теперь мне не нужно бояться быть наказанным чистить лук 6 месяцев на подводной лодке... - person prograde; 13.05.2011