2013-09-07 6 views
6

में पाइथन 2.7 में अनपेक्षित सरोगेट चरित्र का पता लगाएं/हटाएं। मैं यूनिकोड स्ट्रिंग "abc\udc34xyz" को यूटीएफ -8 में सफलतापूर्वक रूपांतरित कर सकता हूं (परिणाम "abc\xed\xb0\xb4xyz" है)। लेकिन जब मैं यूटीएफ -8 स्ट्रिंग को उदाहरण के लिए पास करता हूं। pango_parse_markup() या g_convert_with_fallback(), मुझे "इनपुट इनपुट में अमान्य बाइट अनुक्रम" जैसी त्रुटियां मिलती हैं। स्पष्ट रूप से जीटीके/पेंगो फ़ंक्शन स्ट्रिंग में "अनपेक्षित सरोगेट" का पता लगाते हैं और (सही ढंग से?) इसे अस्वीकार करते हैं।पाइथन 2 + जीटीके

अजगर 3 भी UTF-8 में यूनिकोड स्ट्रिंग के रूपांतरण की अनुमति नहीं है (त्रुटि: " 'utf-8' कोडेक चरित्र सांकेतिक शब्दों में बदलना नहीं कर सकता '\ udc34' स्थान 3: अनुमति नहीं सरोगेट्स"), लेकिन मैं "abc\udc34xyz".encode("utf8", "replace") चला सकता हूं ताकि एक वैध यूटीएफ 8 स्ट्रिंग प्राप्त हो सके जो अकेले सरोगेट के साथ किसी अन्य चरित्र द्वारा प्रतिस्थापित किया जा सके। यह मेरे लिए अच्छा है, लेकिन मुझे पाइथन 2 के लिए समाधान की आवश्यकता है।

तो सवाल यह है कि: पायथन 2.7 में, मैं यूनिकोड स्ट्रिंग को यूटीएफ -8 में कैसे परिवर्तित कर सकता हूं जबकि कुछ प्रतिस्थापन चरित्र के साथ अकेले सरोगेट को बदलना, FFFD? अधिमानतः केवल मानक पायथन कार्यों और जीटीके/जीएलआईबी/जी ... कार्यों का उपयोग किया जाना चाहिए।

बीटीडब्ल्यू। Iconv स्ट्रिंग को यूटीएफ 8 में परिवर्तित कर सकता है लेकिन यू + एफएफएफडी के साथ इसे बदलने के बजाय बस खराब चरित्र को हटा देता है।

उत्तर

9

एन्कोडिंग से पहले प्रतिस्थापन खुद कर सकते हैं:

import re 

lone = re.compile(
    ur'''(?x)   # verbose expression (allows comments) 
    (     # begin group 
    [\ud800-\udbff]  # match leading surrogate 
    (?![\udc00-\udfff]) # but only if not followed by trailing surrogate 
    )     # end group 
    |     # OR 
    (     # begin group 
    (?<![\ud800-\udbff]) # if not preceded by leading surrogate 
    [\udc00-\udfff]  # match trailing surrogate 
    )     # end group 
    ''') 

u = u'abc\ud834\ud82a\udfcdxyz' 
print repr(u) 
b = lone.sub(ur'\ufffd',u).encode('utf8') 
print repr(b) 
print repr(b.decode('utf8')) 

आउटपुट:

invalid_string.encode('utf16').decode('utf16', 'replace')

मेरे समझ है जो:

u'abc\ud834\U0001abcdxyz' 
'abc\xef\xbf\xbd\xf0\x9a\xaf\x8dxyz' 
u'abc\ufffd\U0001abcdxyz' 
-1

यहाँ मेरे लिए यह समस्या ठीक है सरोगेट जोड़े यूटीएफ -16 का हिस्सा हैं, और यही कारण है कि एन्क्यू यूटीएफ -8 के साथ ओडिंग/डिकोडिंग कुछ भी नहीं करता है।

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