2012-02-01 19 views
5

अगर मैं यूनिकोड तारयूनिकोड तार

की एक सूची है की सूची
lst = [ u"aaa", u"bbb", u"foo", u"bar", ... u"baz", u"zzz" ] 

यह हर स्ट्रिंग से पहले एक उपसर्ग u लिखने के लिए आवश्यक है? क्या मैं एक निर्माण कर सकता हूं जो कहता है कि एलएसटी का हर तत्व यूनिकोड स्ट्रिंग होगा और फिर u उपसर्ग के बिना इसे लिखें?

+0

यह आपको अजगर 2 या पायथन 3. का उपयोग कर पर निर्भर करता है –

+0

मैं उपयोग कर रहा हूँ 'पायथन 2.7.2 +', लेकिन अगर आप जवाब पता के लिए दोनों यह हो सकता है भविष्य के लिए उपयोगी – xralf

+0

पायथन 3.x में सभी strigns डिफ़ॉल्ट रूप से यूनिकोड हैं, और पाठ I/O (फाइलें, डेटाबेस, प्रिंटिंग) से निपटने वाले किसी भी चैनल को या तो एक एन्कोडिंग एन्कोडिंग की आवश्यकता होती है या डिफ़ॉल्ट रूप से सिस्टम विस्तृत एन्कोडिंग का उपयोग करती है। – jsbueno

उत्तर

14

अजगर 2.7 (भी अजगर 2.6) में आप यूनिकोड शाब्दिक एक मॉड्यूल के लिए डिफ़ॉल्ट बना सकते हैं:

from __future__ import unicode_literals 

आप फ़ाइल के शीर्ष पर आयात को शामिल करना चाहिए, और यह तो सभी पर लागू होता है फ़ाइल में स्ट्रिंग अक्षर। बाइट तार मजबूर करने के लिए एक b उपसर्ग का उपयोग करें:

>>> from __future__ import unicode_literals 
>>> "sss" 
u'sss' 
>>> b"x" 
'x' 
1

आपका इरादा यूनिकोड को मानक तार का एक सेट कन्वर्ट करने के लिए है, तो आप अपनी सूची पर कि समारोह मैप कर सकते:

lst = ["aaa", "bbb", "ccc"] 
map(unicode, lst) 

कौन देता है तथापि lst एक गैर ASCII शामिल

[u"aaa", u"bbb", u"ccc"] 

हैं वर्ण स्ट्रिंग, आपको u के साथ उस विशेष स्ट्रिंग को उपसर्ग करना होगा। आप नहीं करते हैं, आपके द्वारा रूपांतरण को इस त्रुटि मिल जाएगा:

lst = ["\xe4"] 
map(unicode,lst) 

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128) 

टिप्पणी में बताया गया है, इस उत्तर पायथन 2.x या 3.x. के लिए अलग है पायथन 3, everything changes:

सब कुछ जो आपने सोचा था कि आप बाइनरी डेटा के बारे में जानते थे और यूनिकोड बदल गया है। पायथन 3.0 यूनिकोड स्ट्रिंग्स और 8-बिट स्ट्रिंग्स के बजाय पाठ की अवधारणाओं और (बाइनरी) डेटा का उपयोग करता है। सभी पाठ यूनिकोड है; हालांकि एन्कोडेड यूनिकोड को बाइनरी डेटा के रूप में दर्शाया गया है। पाठ को पकड़ने के लिए उपयोग किया जाने वाला प्रकार str है, डेटा रखने के लिए उपयोग किया जाने वाला प्रकार बाइट है। 2.x स्थिति के साथ सबसे बड़ा अंतर यह है कि पायथन 3.0 में टेक्स्ट और डेटा को मिश्रित करने का कोई भी प्रयास टाइपरर बढ़ाता है, जबकि यदि आप पाइथन 2.x में यूनिकोड और 8-बिट तारों को मिश्रण करना चाहते हैं, तो यह 8-बिट पर काम करेगा स्ट्रिंग में केवल 7-बिट (ASCII) बाइट्स होते थे, लेकिन यदि आप गैर-ASCII मानों को शामिल करते हैं तो आपको यूनिकोडडेकोड एरर मिल जाएगा। इस मूल्य-विशिष्ट व्यवहार ने पिछले कुछ वर्षों में कई दुखद चेहरे पैदा किए हैं।

+0

मैं केवल कुछ बेहतर घोषणा का उपयोग करना चाहता हूं जो मुझे टाइपिंग बचाता है। कुछ 'lst = u ["aaa", "bbb", "ccc"]' जो कुछ बताएगा कि 'lst' में प्रत्येक स्ट्रिंग यूनिकोड है। – xralf

+0

-1 यूनिकोड एन्कोडिंग के बारे में नहीं जानने के लिए, और यह सोचकर कि "ASCII ठीक है" - कृपया पढ़ें http://www.joelonsoftware.com/articles/Unicode.html – jsbueno

+0

@jsbueno - कहीं भी मैंने कहा कि डिफ़ॉल्ट पायथन 2। एक्स एन्कोडिंग (एएससीआईआईआई) "ठीक है"। मैंने स्पष्ट रूप से स्पष्ट ASCII एन्कोडिंग के साथ यूनिकोड प्रतिनिधित्व में केवल ASCII एन्कोडिंग के रूप में देखने के लिए ओपी की सूची को परिवर्तित करने के लिए एक त्वरित और गंदे विधि को बताया। क्या वह यही चाहता था? मुझे पूरी तरह से यकीन नहीं है क्योंकि उसने एन्कोडिंग को निर्दिष्ट नहीं किया था, इसलिए मैंने अनुमान लगाया। इस साइट पर मूल्य जोड़ने के लिए, यदि आपको लगता है कि विभिन्न एन्कोडिंग के बारे में विस्तृत स्पष्टीकरण की आवश्यकता है, तो कृपया इसे किसी अन्य उत्तर में प्रदान करें! – Hooked

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