Преобразование объектов Unicode с не-ASCII-символами в них в строковые объекты (в Python) - PullRequest
4 голосов
/ 08 сентября 2010

Я хочу отправить китайские иероглифы для перевода онлайн-сервисом и получить полученную английскую строку. Я использую простой JSON и urllib для этого.

И да, я заявляю.

# -*- coding: utf-8 -*-

поверх моего кода.

Теперь все работает нормально, если я передаю urllib объект строкового типа, даже если этот объект содержит то, что будет информацией Unicode. Моя функция называется translate.

Например:

stringtest1 = '無與倫比的美麗'

print translate(stringtest1)

приводит к правильному переводу и выполнению

type(stringtest1) 

подтверждает, что это строковый объект.

Но если сделать

stringtest1 = u'無與倫比的美麗'

и попробуйте использовать мою функцию перевода, я получаю эту ошибку:

  File "C:\Python27\lib\urllib.py", line 1275, in urlencode
    v = quote_plus(str(v))
UnicodeEncodeError: 'ascii' codec can't encode characters in position 2-8: ordinal not in range(128)

После небольшого исследования кажется, что это общая проблема:

Теперь, если я наберу скрипт

stringtest1 = '無與倫比的美麗' 
stringtest2 = u'無與倫比的美麗'
print 'stringtest1',stringtest1
print 'stringtest2',stringtest2

Возврат:

stringtest1 無與倫比的美麗
stringtest2 無與倫比的美麗

Но просто введите переменные в консоли:

>>> stringtest1
'\xe7\x84\xa1\xe8\x88\x87\xe5\x80\xab\xe6\xaf\x94\xe7\x9a\x84\xe7\xbe\x8e\xe9\xba\x97'
>>> stringtest2
u'\u7121\u8207\u502b\u6bd4\u7684\u7f8e\u9e97'

поймай меня.

Моя проблема в том, что я не контролирую, как информация, которая должна быть переведена, попадает в мои функции. И, похоже, я должен привести его в форме Unicode, которая не принимается функцией.

Итак, как мне преобразовать одну вещь в другую?

Я прочитал вопрос переполнения стека Преобразование Unicode в строку в Python (содержащую дополнительные символы) .

Но я не об этом. Urllib принимает строковый объект, но не объект Unicode, оба содержат одинаковую информацию

Ну, по крайней мере, в глазах веб-приложения, которому я отправляю неизмененную информацию, я не уверен, что они все еще эквивалентны в Python.

1 Ответ

8 голосов
/ 08 сентября 2010

Когда вы получаете объект unicode и хотите вернуть из него строку байтов в кодировке UTF-8, используйте theobject.encode('utf8').

Кажется странным, что вы не знаете, является ли входящий объект str или unicode - конечно же, вы контролируете сайты вызова для этой функции тоже ?! Но если это действительно так, по какой-то странной причине вам может понадобиться что-то вроде:

def ensureutf8(s):
    if isinstance(s, unicode):
        s = s.encode('utf8')
    return s

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

Кстати, часть вашей путаницы, по-видимому, связана с тем, что вы не знаете, что простой ввод выражения в приглашении интерпретатора покажет вам repr, что не то же самое, что вы получаете с print; -.)

...