2012-09-28 13 views
7

मुझे किसी अन्य चरित्र में 4-बाइट चार को परिवर्तित करने की आवश्यकता है (पायथन में)। यह मेरे यूटीएफ -8 mysql डेटाबेस में एक त्रुटि प्राप्त किए बिना डालने के लिए है: "गलत स्ट्रिंग मान: '\ xF0 \ x9F \ x94 \ x8E' पंक्ति 1 पर 'कॉलम' लाइन के लिए 'पायथन, MySQL त्रुटि से बचने के लिए 4-बाइट चार रूपांतरित करें "गलत स्ट्रिंग मान:"

Warning raised by inserting 4-byte unicode to mysql दिखाता है यह इस तरह से कार्य करें:

>>> import re 
>>> highpoints = re.compile(u'[\U00010000-\U0010ffff]') 
>>> example = u'Some example text with a sleepy face: \U0001f62a' 
>>> highpoints.sub(u'', example) 
u'Some example text with a sleepy face: ' 

हालांकि, मैं टिप्पणी में उपयोगकर्ता, के रूप में एक ही त्रुटि मिलती है "... बुरा चरित्र रेंज .." यह जाहिरा तौर पर है क्योंकि मेरे अजगर एक यूसीएस -2 (नहीं यूसीएस है -4) निर्माण। लेकिन फिर मैं स्पष्ट नहीं हूं कि इसके बजाय क्या करना है?

+0

अगर आप MySql में [utf8mb4] (http://dev.mysql.com/doc/refman/5.5/en/charset-unicode-utf8mb4.html) चारसेट का उपयोग यह अभी भी एक समस्या है? –

+0

निश्चित नहीं है। दुर्भाग्य से मैं डेटाबेस के वर्णमाला को बदलने के लिए नहीं मिलता है। – user984003

उत्तर

15

एक यूसीएस -2 बिल्ड में, पाइथन \U0000ffff कोड बिंदु पर प्रत्येक यूनिकोड चरित्र के लिए आंतरिक रूप से 2 कोड इकाइयों का उपयोग करता है। ताकि आप इन मैच के लिए निम्नलिखित रेगुलर एक्सप्रेशन का उपयोग करने की आवश्यकता होगी रेगुलर एक्सप्रेशन वे उन के साथ काम करने की जरूरत है:।

highpoints = re.compile(u'[\uD800-\uDBFF][\uDC00-\uDFFF]') 

यह नियमित अभिव्यक्ति एक UTF-16 के किराए की जोड़ी के साथ इनकोडिंग किसी भी कोड बिंदु से मेल खाता है (UTF-16 Code points U+10000 to U+10FFFF देख

इस अजगर यूसीएस -2 और यूसीएस 4 संस्करणों में संगत बनाने के लिए, आप एक try:/except एक या अन्य उपयोग करने के लिए इस्तेमाल कर सकते हैं:

try: 
    highpoints = re.compile(u'[\U00010000-\U0010ffff]') 
except re.error: 
    # UCS-2 build 
    highpoints = re.compile(u'[\uD800-\uDBFF][\uDC00-\uDFFF]') 

एक यूसीएस -2 अजगर निर्माण पर प्रदर्शन:

>>> import re 
>>> highpoints = re.compile(u'[\uD800-\uDBFF][\uDC00-\uDFFF]') 
>>> example = u'Some example text with a sleepy face: \U0001f62a' 
>>> highpoints.sub(u'', example) 
u'Some example text with a sleepy face: ' 
+0

बहुत बढ़िया, यह काम करता है। धन्यवाद। – user984003

संबंधित मुद्दे