Abych ujasnil pár věcí, protože vám to pomůže i v budoucnu.
txt = u'Arabic (\u0627\u0644\u0637\u064a\u0631\u0627\u0646)'
Toto není arabský řetězec. Toto je objekt unicode , s kódovými body Unicode. Pokud byste jej jednoduše vytiskli a váš terminál podporuje arabštinu, dostanete výstup takto:
>>> txt = u'Arabic (\u0627\u0644\u0637\u064a\u0631\u0627\u0646)'
>>> print(txt)
Arabic (الطيران)
Nyní, abyste získali stejný výstup jako Arabic (الطيران)
ve vaší databázi musíte řetězec zakódovat.
Kódování bere tyto kódové body; a jejich převod na bajty, aby počítače věděly, co s nimi dělat.
Nejběžnějším kódováním je tedy utf-8
, protože podporuje všechny znaky angličtiny a spoustu dalších jazyků (včetně arabštiny). Existují i jiné, například windows-1256
podporuje také arabštinu. Existují některá, která pro tato čísla nemají odkazy (nazývané kódové body), a když se pokusíte kódovat, zobrazí se tato chyba:
>>> 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)
Říká vám to, že nějaké číslo v objektu unicode v tabulce latin-1
neexistuje , takže program neví, jak jej převést na bajty.
Počítače ukládají bajty. Takže když ukládáte nebo přenášíte informace, musíte je vždy správně zakódovat/dekódovat.
Tento krok kódování/dekódování se někdy nazývá sendvič unicode - vše venku je bajty, vše uvnitř je unicode.
Když to není z cesty, musíte data před odesláním do databáze správně zakódovat; Chcete-li to provést, zakódujte jej:
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))
Chcete-li potvrdit, že se vkládá správně, ujistěte se, že používáte mysql z terminálu nebo aplikace, která podporuje arabštinu; jinak – i když je vložen správně, když je zobrazen vaším programem – uvidíte nesmyslné znaky.