Pour clarifier certaines choses, car cela vous aidera également à l'avenir.
txt = u'Arabic (\u0627\u0644\u0637\u064a\u0631\u0627\u0646)'
Ce n'est pas une chaîne arabe. Ceci est un objet unicode , avec des points de code Unicode. Si vous deviez simplement l'imprimer, et si votre terminal prend en charge l'arabe, vous obtiendriez une sortie comme celle-ci :
>>> txt = u'Arabic (\u0627\u0644\u0637\u064a\u0631\u0627\u0646)'
>>> print(txt)
Arabic (الطيران)
Maintenant, pour obtenir la même sortie comme Arabic (الطيران)
dans votre base de données, vous devez encoder la chaîne.
L'encodage prend ces points de code ; et les convertir en octets pour que les ordinateurs sachent quoi en faire.
L'encodage le plus courant est donc utf-8
, car il prend en charge tous les caractères de l'anglais, ainsi que de nombreuses autres langues (y compris l'arabe). Il y en a d'autres aussi, par exemple, windows-1256
prend également en charge l'arabe. Certains n'ont pas de références pour ces nombres (appelés points de code), et lorsque vous essayez d'encoder, vous obtenez une erreur comme celle-ci :
>>> 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)
Ce que cela vous dit, c'est qu'un certain nombre dans l'objet Unicode n'existe pas dans la table latin-1
, donc le programme ne sait pas comment le convertir en octets.
Les ordinateurs stockent des octets. Ainsi, lors du stockage ou de la transmission d'informations, vous devez toujours les encoder/décoder correctement.
Cette étape d'encodage/décodage est parfois appelée le unicode sandwich - tout ce qui est à l'extérieur est en octets, tout ce qui est à l'intérieur est en Unicode.
Avec cela à l'écart, vous devez encoder correctement les données avant de les envoyer à votre base de données; pour cela, encodez-le :
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))
Pour confirmer qu'il est inséré correctement, assurez-vous que vous utilisez mysql à partir d'un terminal ou d'une application prenant en charge l'arabe; sinon - même s'il est inséré correctement, lorsqu'il est affiché par votre programme - vous verrez des caractères parasites.