Я написал код в Python 3.5, где я использовал Tweepy & SQLAlchemy & следующие строки для загрузки твитов в базу данных, и она работала хорошо:Как обрабатывать кодирования в Python 2.7 и SQLAlchemy ☠️
twitter = Twitter(str(tweet.user.name).encode('utf8'), str(tweet.text).encode('utf8'))
session.add(twitter)
session.commit()
Используя тот же самый код сейчас в Python 2.7 вызывает ошибку:
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2026' in position 139: ordinal not in range(128)
Что такое решение? Моя конфигурация MySQL заключается в следующем:
стороне сервера -> Кодировка utf8mb4
стороне клиента ->create_engine('mysql+pymysql://abc:de[email protected]/def', encoding='utf8', convert_unicode=True)
):
UPDATE
Кажется, что нет никакого решения , по крайней мере, не с Python 2.7 + SQLAlchemy. Вот что я узнал до сих пор, и если я ошибаюсь, пожалуйста, поправьте меня.
Tweepy, по крайней мере, в Python 2.7, возвращает объекты типа Unicode.
В Python 2.7: tweet = u'☠'
является <'unicode' type>
В Python 3.5: tweet = u'☠'
является <'str' class>
Это означает, что Python 2.7 даст мне 'UnicodeEncodeError', если я str(tweet)
, потому что Python 2.7 затем пытается кодировать этот символ «☠» в ASCII, что невозможно, поскольку ASCII может обрабатывать только this basic characters.
Вывод:
Используя только это утверждение tweet.user.name
в SQLAlchemy линии дает мне следующую ошибку:
UnicodeEncodeError: 'latin-1' codec can't encode characters in position 0-4: ordinal not in range(256)
Используя либо это заявление tweet.user.name.encode('utf-8')
или это один str(tweet.user.name.encode('utf-8'))
в SQLAlchemy линии должны реально работать право но он показывает мне незакодированные символы на стороне базы данных:
ð´ââ ï¸Jack Sparrow
Это то, что я хочу, чтобы показать:
Отпечатано: ☠️ Jack Sparrow
Специальные символы юникода: u'\U0001f3f4\u200d\u2620\ufe0f'
Специальные символы UTF-8 кодировка: '\xf0\x9f\x8f\xb4\xe2\x80\x8d\xe2\x98\xa0\xef\xb8\x8f'
Это: '# - * - кодирование: utf-8 - * -' это просто комментарий и только соглашение или оно приносит какое-либо значение коду? – saitam
'# - * - кодирование: utf-8 - * -' говорит интерпретатору, кодирование которого используется при разборе файла, оно затрагивает только файлы, содержащие символы не-ascii (литералы). Это никак не влияет на код. Кроме того, посмотрите раздел [mysql unicode в документе sqlalchemy doc] (http://docs.sqlalchemy.org/en/latest/dialects/mysql.html#unicode), вам нужно добавить '? Charset = .. . 'к вашему соединению url для изменения кодировки соединения – mata