2017-02-07 7 views
1

私はデータベースにツイートを読み込むためにSQLAlchemyの&次の行をTweepy &を使用していたのPython 3.5、内のコードを書かれているし、それがうまく働いた:は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:[email protected]/def', encoding='utf8', convert_unicode=True)):

UPDATE

何の解決策が存在しないようです、少なくともPython 2.7 + SQLAlchemyではありません。ここに私がこれまでに見つけたものがあります、もし私が間違っていたら、私を修正してください。

Tweepyは、少なくともPython 2.7では、ユニコードタイプのオブジェクトを返します。 Pythonの2.7で

tweet = u'☠'は、Python 3.5では<'unicode' type>

です:tweet = u'☠'<'str' class>

ですこれは私がstr(tweet)を行う場合はPython 2.7は、その後、エンコードしようとするためのPython 2.7は私に 'UnicodeEncodeErrorを' を与えることを意味しますこの文字 '☠'はASCIIに変換できません。ASCIIはthis basic charactersしか処理できないため、不可能です。

結論:実際に権利を動作するはずです。この文のtweet.user.name.encode('utf-8')またはSQLAlchemyのラインで、この1 str(tweet.user.name.encode('utf-8'))のいずれかを使用して

UnicodeEncodeError: 'latin-1' codec can't encode characters in position 0-4: ordinal not in range(256)

:SQLAlchemyのラインでちょうどこの文tweet.user.nameを使用するには、

私に次のエラーを与えますしかし、それはデータベース側で私に符号化されていない文字を表示します:

ð´ââ ï¸Jack Sparrow

これは私がそれを示したいものです:

印刷

を:‍☠️ Jack Sparrow

特殊文字のユニコード:u'\U0001f3f4\u200d\u2620\ufe0f'

特殊文字をUTF-8エンコーディング:'\xf0\x9f\x8f\xb4\xe2\x80\x8d\xe2\x98\xa0\xef\xb8\x8f'

答えて

0

/任意のエンコードを使用しないでくださいデコード関数。彼らは問題を複合化するだけです。

接続をUTF-8に設定しますか。
utf8ではなくutf8mb4に列/テーブルを設定します。
# -*- coding: utf-8 -*-をPythonコードの先頭に使用してください。

続きを読むPython tips「Python 2.7の問題:Python 3の改善」へのリンクがあります。

+0

これは '# - * - coding:utf-8 - * - 'は単なるコメントであり、規約にすぎないのですか? – saitam

+2

'# - * - coding:utf-8 - * - 'は、ファイルの解析時に使用するエンコーディングをインタープリターに指示しますが、ASCII以外の文字(リテラル)を含むファイルにのみ影響します。他の方法ではコードには影響しません。また、[sqlalchemy docの[mysql unicode]セクション(http://docs.sqlalchemy.org/en/latest/dialects/mysql.html#unicode)を見て、 '?charset = ..を追加する必要があります。あなたの接続URLに接続文字セットを変更する – mata

関連する問題