2016-07-01 12 views
14

यह Converting to Emoji पर एक फॉलो-अप है। उस प्रश्न में, ओपी के पास json.dumps() -encoded फ़ाइल थी जिसमें एक इमोजी के साथ सरोगेट जोड़ी - \ud83d\ude4f के रूप में प्रतिनिधित्व किया गया था। एस/उसे फ़ाइल पढ़ने और इमोजी का सही ढंग से अनुवाद करने में समस्याएं थीं, और सही answer फ़ाइल से प्रत्येक पंक्ति json.loads() थी, और json मॉड्यूल सरोगेट जोड़ी से रूपांतरण को वापस संभालेगा (मैं यूटीएफ 8-एन्कोडेड मान रहा हूं) इमोजी।पायथन में सरोगेट जोड़े के साथ कैसे काम करें?

तो यहाँ

मेरी स्थिति है: कहते हैं कि मैं उस में एक किराए की जोड़ी के साथ सिर्फ एक नियमित रूप से अजगर 3 यूनिकोड स्ट्रिंग है: इससे बाहर emoji का प्रतिनिधित्व प्राप्त करने के लिए

emoji = "This is \ud83d\ude4f, an emoji." 

मैं इस स्ट्रिंग कैसे संसाधित होने पर ? मैं कुछ इस तरह प्राप्त करने के लिए देख रहा हूँ:

"This is , an emoji." 
# or 
"This is \U0001f64f, an emoji." 

मैं कोशिश की है:

print(emoji) 
print(emoji.encode("utf-8")) # also tried "ascii", "utf-16", and "utf-16-le" 
json.loads(emoji) # and `.encode()` with various codecs 

आम तौर पर मैं UnicodeEncodeError: XXX codec can't encode character '\ud83d' in position 8: surrogates no allowed के समान कोई त्रुटि मिलती है।

मैं लिनक्स पर पाइथन 3.5.1 चला रहा हूं, $LANGen_US.UTF-8 पर सेट है। मैंने कमांड लाइन पर पाइथन दुभाषिया दोनों में इन नमूनों को चलाया है, और सब्लिमे टेक्स्ट में चल रहे आईपीथॉन के भीतर - कोई अंतर नहीं दिखता है।

उत्तर

21

आप एक शाब्दिक स्ट्रिंग \ud83d मिलाया गया है डिस्क पर एक json फ़ाइल में (छह वर्ण: \ u d 8 3 d) और एक एकल चरित्र u'\ud83d' स्मृति में (एक स्ट्रिंग अजगर स्रोत कोड में शाब्दिक का उपयोग कर निर्दिष्ट)। आप '\ud83d\ude4f' अजगर स्ट्रिंग (अक्षर) देख फिर वहाँ एक बग नदी के ऊपर है, तो यह अजगर 3.

पर len(r'\ud83d') == 6 और len('\ud83d') == 1 के बीच अंतर है। आम तौर पर, आपको ऐसी स्ट्रिंग नहीं मिलनी चाहिए। यदि आप एक प्राप्त करते हैं और आप इसे उत्पन्न करने वाले अपस्ट्रीम को ठीक नहीं कर सकते हैं; आप surrogatepass त्रुटि हैंडलर का उपयोग कर इसे ठीक कर सकता है:

>>> "\ud83d\ude4f".encode('utf-16', 'surrogatepass').decode('utf-16') 
'' 

Python 2 was more permissive

नोट: भले ही आपकी जेसन फ़ाइल में शाब्दिक \ ud83d \ ude4f (वर्ण शामिल हों); आप किराए की जोड़ी नहीं मिलना चाहिए:

>>> print(ascii(json.loads(r'"\ud83d\ude4f"'))) 
'\U0001f64f' 

नोटिस: परिणाम चरित्र ('\U0001f64f'), नहीं किराए की जोड़ी ('\ud83d\ude4f') है।

+0

बहुत बढ़िया, धन्यवाद! मैं 'surrogatepass' त्रुटि हैंडलर खो रहा था। – MattDMo

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