いくつかのことを明確にするために、それは将来的にも役立つからです。
txt = u'Arabic (\u0627\u0644\u0637\u064a\u0631\u0627\u0646)'
これはアラビア語の文字列ではありません。これはUnicodeオブジェクトです 、Unicodeコードポイントを使用します。単に印刷するだけで、端末がアラビア語をサポートしている場合は、次のような出力が得られます。
>>> txt = u'Arabic (\u0627\u0644\u0637\u064a\u0631\u0627\u0646)'
>>> print(txt)
Arabic (الطيران)
ここで、Arabic (الطيران)
のような同じ出力を取得します データベースでは、文字列をエンコードする必要があります。
エンコーディングはこれらのコードポイントを取ります。そして、それらをバイトに変換して、コンピューターがそれらをどう処理するかを認識できるようにします。
したがって、最も一般的なエンコーディングはutf-8
です。 、英語のすべての文字に加えて、他の多くの言語(アラビア語を含む)をサポートしているためです。他にも、たとえばwindows-1256
などがあります。 アラビア語もサポートしています。これらの数値(コードポイントと呼ばれる)への参照がないものもあり、エンコードしようとすると、次のようなエラーが発生します。
>>> print(txt.encode('latin-1'))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'latin-1' codec can't encode characters in position 8-14: ordinal not in range(256)
つまり、Unicodeオブジェクトの一部の数値がテーブルlatin-1
に存在しないということです。 、したがって、プログラムはそれをバイトに変換する方法を知りません。
コンピュータはバイトを保存します。したがって、情報を保存または送信するときは、常に正しくエンコード/デコードする必要があります。
このエンコード/デコードステップは、ユニコードサンドイッチ と呼ばれることもあります。 -外側はすべてバイトで、内側はすべてユニコードです。
それが邪魔にならないように、データベースに送信する前にデータを正しくエンコードする必要があります。これを行うには、エンコードします:
q = u"""
INSERT INTO
tab1(id, username, text, created_at)
VALUES (%s, %s, %s, %s)"""
conn = MySQLdb.connect(host="localhost",
user='root',
password='',
db='',
charset='utf8',
init_command='SET NAMES UTF8')
cur = conn.cursor()
cur.execute(q, (id.encode('utf-8'),
user_name.encode('utf-8'),
text.encode('utf-8'), date))
正しく挿入されていることを確認するには、アラビア語をサポートするターミナルまたはアプリケーションからmysqlを使用していることを確認してください。そうしないと、正しく挿入されていても、プログラムで表示されたときに、ごみ文字が表示されます。