использование расширенных символов ascii для API Викимедиа - PullRequest
0 голосов
/ 22 сентября 2010

Я пишу простой алгоритм поиска для Википедии. У меня возникают проблемы, когда я отправляю запрос с символами, которые имеют акценты, и другими символами, которых нет на обычном английском языке. Запросы, которые возвращаются с ошибкой:
http://en.wikipedia.org/w/api.php?action=query&titles=Albrecht%20Dürer&prop=links&pllimit=33&format=xml
http://en.wikipedia.org/w/api.php?action=query&titles=Ancien%20Régime&prop=links&pllimit=33&format=xml
http://en.wikipedia.org/w/api.php?action=query&titles=Feigenbaum-Cvitanović&prop=links&pllimit=33&format=xml
http://en.wikipedia.org/w/api.php?action=query&titles=Banach–Tarski%20paradox&prop=links&pllimit=33&format=xml
http://en.wikipedia.org/w/api.php?action=query&titles=Grundzüge%20der%20Mengenlehre&prop=links&pllimit=33&format=xml
http://en.wikipedia.org/w/api.php?action=query&titles=Grundzüge%20einer%20Theorie%20der%20geordneten%20Mengen&prop=links&pllimit=33&format=xml
http://en.wikipedia.org/w/api.php?action=query&titles=Karl%20Bögel&prop=links&pllimit=33&format=xml

Но запрос работает нормально, если есть такие простые символы, как «Фракталы». Как мне изменить формат запроса, чтобы эта работа работала?

Мой код с открытым исходным кодом: http://code.google.com/p/wikipediafoundation/source/browse/. Пожалуйста, посмотрите на hg / src / list.py.

1 Ответ

1 голос
/ 22 сентября 2010

Я не вижу в вашем источнике Python следа того, как вы кодируете любые символы, отличные от ascii, которые вы отправляете в запросе. Для URL-адресов (включая строки запроса в них), использующих что-либо, кроме ascii, вам нужно (сделать их юникодом, если они уже нет), затем кодировать их в utf-8 и в процентах экранировать результат (для последнего используйте функцию urllib.quote_plus из стандартного библиотечного модуля Python urllib и, конечно, для кодирования, метод .encode('utf8') строки Unicode - если вам нужно создать строку Unicode из строки байтов с другой кодировкой, используйте строку .decode('latin-1') строки байтов - или, конечно, независимо от названия кодировки, в которой оно находится; -).

...