कुछ बातों को स्पष्ट करने के लिए, क्योंकि यह भविष्य में भी आपकी मदद करेगी।
txt = u'Arabic (\u0627\u0644\u0637\u064a\u0631\u0627\u0646)'
यह अरबी स्ट्रिंग नहीं है। यह एक यूनिकोड ऑब्जेक्ट है , यूनिकोड कोडपॉइंट के साथ। यदि आप इसे केवल प्रिंट करते हैं, और यदि आपका टर्मिनल अरबी का समर्थन करता है तो आपको इस तरह का आउटपुट मिलेगा:
>>> 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)
जो आपको बता रहा है वह यह है कि यूनिकोड ऑब्जेक्ट में कुछ संख्या 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 का उपयोग कर रहे हैं जो अरबी का समर्थन करता है; अन्यथा - भले ही इसे सही ढंग से डाला गया हो, जब यह आपके प्रोग्राम द्वारा प्रदर्शित किया जाता है - आपको कचरा पात्र दिखाई देंगे।