2010-07-20 1 views
9

Я хотел, чтобы url закодировал строку python и получил исключения из ивритных строк. Я не мог исправить это и начал делать некоторые предположения, ориентированные на программирование. Наконец, делая mystr = mystr.encode("utf8") перед отправкой его в кодировщик URL, он сохранил день.Python: что делает «...». Encode («utf8») исправить?

Может ли кто-нибудь объяснить, что произошло? Что делает .encode ("utf8")? Моя исходная строка всегда была строкой unicode (т. Е. С префиксом u).

+9

Это не прямой ответ, но этот текст стоит прочитать: [Абсолютный минимум Каждый разработчик программного обеспечения Абсолютно, положительно должен знать об Unicode и наборах символов (никаких оправданий!)] (Http: //www.joelonsoftware. com/articles/Unicode.html) Joel Spolsky – balpha

+8

Удовлетворенное программированием. Теперь это популярная парадигма :) – Amnon

+0

в моем опыте изучения основ (как вы здесь делаете) более эффективен. – Amnon

ответ

9

Вы оригинальная строка была объектом юникода, содержащим необработанные коды Unicode, после кодирования в виде UTF-8 это нормальная байтовая строка, содержащая закодированные данные UTF-8.

Кодировщик URL, похоже, ожидает байтовую строку, так что он может кодировать один байт за другим и не должен иметь дело с кодами Unicode. Когда вы даете ему объект unicode, он пытается преобразовать его в строку байта, используя некоторую кодировку по умолчанию, возможно ASCII. Для символов иврита, которые не могут быть представлены как ASCII, это приведет к ошибкам.

1

"...". Encode ("utf-8") преобразует представление строки в виде строки в строку с кодировкой UTF-8.

url-кодировщик, вероятно, предположил бы байтовую строку, то есть строковое представление, где каждый символ представлен одним байтом.

0

Он возвращает кодированную версию UIF-8 строки Unicode, mystr. Важно понимать, что UTF-8 - это всего лишь один способ кодирования Unicode. Python может работать со многими другими кодировками (например, mystr.encode («utf32») или даже mystr.encode («ascii»)).

0

link, который опубликовал balpha, объясняет все это. Короче говоря:

То, что ваша строка была префиксами «u», означает, что она состоит из Unicode символов (или кодовых точек). UTF-8 является кодировкой этой строки в последовательности байт.

13

Моя исходная строка была юникода строка в любом случае (т.е. префиксом U)

... который является проблемой. Это не была «строка», как таковая, а «объект Unicode». Он содержит последовательность кодов Unicode. Разумеется, эти кодовые точки должны иметь внутреннее представление, о котором знает Python, но что бы это ни было, абстрагируется, и они отображаются как те \uXXXX объектов, когда вы print repr(my_u_str).

Чтобы получить последовательность байтов, которую может понять другая программа, вам необходимо принять эту последовательность кодов Юникода и закодировать ее. Вам нужно определиться с кодировкой, потому что есть выбор. UTF8 и UTF16 являются общими вариантами. ASCII тоже может быть, если он подходит. u"abc".encode('ascii') работает просто отлично.

ли my_u_str = u"\u2119ython", а затем type(my_u_str) и type(my_u_str.encode('utf8')), чтобы увидеть разницу в типах: первый <type 'unicode'> и второй является <type 'str'>. (В Python 2.5 и 2.6, во всяком случае).

В Python 3 все по-другому, но поскольку я редко использую его, я бы говорил из своей шляпы, если бы попытался сказать что-нибудь авторитетное.

+0

+1 Отличное объяснение. –

+0

[This] (https://tools.ietf.org/html/rfc3986), по-видимому, подразумевает utf-8 для чего-либо еще не ASCII, плюс если это из w3schools, мы знаем, что у него нет полномочий. w3fools.com – stommepoes

4

Что такое .encode ("utf8")?

Это зависит от того, какая версия Python вы используете:

  • В Python 3.x, он преобразует str объект (в кодировке UTF-16 или UTF-32) в bytes объект содержащий представление UTF-8 строки.
  • В Python 2.x он преобразует объект unicode в объект str, закодированный в UTF-8. Но str также имеет метод encode, и запись '...'.encode('UTF-8') эквивалентна написанию '...'.decode('ascii').encode('UTF-8').

Поскольку вы упомянули префикс «u», вы должны использовать 2.x. Если вам не нужны какие-либо библиотеки, содержащие только 2.x, я бы рекомендовал переключиться на 3.x, который имеет четкое различие между текстовыми и двоичными данными.

Dive into Python 3 имеет хорошее объяснение проблемы.

Может кто-нибудь объяснить, что произошло?

Это поможет, если вы сообщите нам, что сообщение об ошибке было.

urllib.quote функция ожидает str объект. Также происходит работа с объектами unicode, которые содержат только символы ASCII, но не тогда, когда они содержат ивритские буквы.

В Python 3.x, urllib.parse.quotestr принимает как (= Python 2.x unicode) и bytes объектов. Строки автоматически кодируются в UTF-8.

 Смежные вопросы

  • Нет связанных вопросов^_^