Кодировка URI в UNICODE для Apache httpclient 4 - PullRequest
1 голос
/ 17 февраля 2010

Я работаю с Apache http клиент 4 для всех моих веб-доступов. Это означает, что каждый запрос, который мне нужно сделать, должен пройти проверку синтаксиса URI. Один из сайтов, к которым я пытаюсь получить доступ, использует UNICODE в качестве кодировки GET-параметров url, т.е.:

http://maya.tase.co.il/bursa/index.asp?http://maya.tase.co.il/bursa/index.asp?view=search&company_group=147&srh_txt=%u05E0%u05D9%u05D1&arg_comp=&srh_from=2009-06-01&srh_until=2010-02-16&srh_anaf=-1&srh_event=9999&is_urgent=0&srh_company_press=

(параметр "srh_txt =% u05E0% u05D9% u05D1" кодирует srh_txt = ניב в UNICODE)

Проблема в том, что URI не поддерживает кодировку UNICODE (он поддерживает только UTF-8) Здесь действительно большая проблема заключается в том, что этот сайт ожидает, что его параметры будут закодированы в UNICODE, поэтому любые попытки конвертировать URL с помощью String.format (" http: //...srh_txt=%s&. .. ", URLEncoder.encode (" ניב "," UTF8 ")) в результате получается URL-адрес, который является допустимым и может использоваться для создания URI, но ответ сайта на него с сообщением об ошибке, поскольку это не кодировка, которую он ожидает.

кстати, объект URL может быть создан и даже использован для подключения к веб-сайту с помощью неконвертированного URL. Есть ли способ создания URI в кодировке не UTF-8? Есть ли способ работы с Apache httpclient 4 с обычным URL (а не URI)?

спасибо, Нив

1 Ответ

1 голос
/ 17 февраля 2010

(параметр "srh_txt =% u05E0% u05D9% u05D1" кодирует srh_txt = ניב в UNICODE)

Это не совсем так. Это не кодировка URL, и последовательность %u является недействительной в URL.

%u05E0%u05D9%u05D1" кодирует ניב только в странном синтаксисе JavaScript escape. escape аналогично URL-кодированию для всех символов ASCII, за исключением +, но экранирование %u####, которое он производит для символов Юникода, полностью является его собственным изобретением.

(В общем, никогда не следует использовать escape. Использование encodeURIComponent вместо этого приводит к правильному URL-кодированию UTF-8, ניב = %D7%A0%D7%99%D7%91.)

Если сайт требует %u#### последовательностей в строке запроса, он очень сильно поврежден.

Есть ли способ создания URI в кодировке, отличной от UTF-8?

Да, URI могут использовать любую понравившуюся вам кодировку. Это условно UTF-8; это то, что требуется IRI и что браузеры обычно отправляют, если пользователь вводит символы не-ASCII в адресную строку, но сам URI касается только байтов.

Так что вы можете конвертировать ניב в %F0%E9%E1. Веб-приложение не сможет сказать, что эти байты представляют собой символы, закодированные в кодовой странице 1255 (иврит, аналогично ISO-8859-8). Но, похоже, это работает по ссылке выше, чего нет в версии UTF-8. О дорогой!

...