Кодирование специальных символов для передачи на URL - PullRequest
10 голосов
/ 22 марта 2019

Я пытаюсь изучить Python, поэтому я подумал, что начну с запроса к IMDB, чтобы проверить мою коллекцию фильмов по сравнению с IMDB; который шел хорошо ?

Я застрял в том, как обрабатывать специальные символы в именах и кодировать имя во что-то, что URL будет уважать.

Например, у меня есть фильм Brüno

Если я кодирую строку, используя urllib.parse.quote, я получаю - Bru%CC%88no, что означает, что когда я запрашиваю IMDB, используя OMDBAPI, он не может найти фильм. Если я выполняю поиск по сайту OMDBAPI, они кодируют имя как Br%C3%BCno, и этот поиск работает.

Я предполагаю, что кодирование использует другой стандарт, но я не могу понять, что мне нужно сделать

1 Ответ

8 голосов
/ 22 марта 2019

Используется та же кодировка , но с разными нормировками.

>>> import unicodedata
>>> "Brüno".encode("utf-8")
b'Bru\xcc\x88no'
>>> unicodedata.normalize("NFC", "Brüno").encode("utf-8")
b'Br\xc3\xbcno'

Некоторые графемы (вещи, которые вы видите как один «символ»), особенно те, которые содержат диакритические знаки, могут быть сделаны из разных символов. «Ü» может быть либо «u» с комбинированным диарезом, либо самим символом «ü» (комбинированная форма). Комбинированные формы не существуют для каждой комбинации букв и диакритических знаков, но они существуют для часто используемых (= существующих на общих языках).

Нормализация Unicode преобразует все символы, которые образуют графемы, в комбинированные или отдельные символы. Метод нормализации "NFC", или Форма нормализации канонической композиции , максимально комбинирует символы.

Для сравнения, другая основная форма, Форма нормализации канонического разложения , или "NFD", создаст вашу версию:

>>> unicodedata.normalize("NFD", "Brüno").encode("utf-8")
b'Bru\xcc\x88no'
...