अजगर में एक यूनिकोड स्ट्रिंग को स्ट्रिंग में बदलें (अतिरिक्त प्रतीकों वाले)


502

आप एक यूनिकोड स्ट्रिंग (£ £, आदि जैसे अतिरिक्त वर्णों सहित) को पायथन स्ट्रिंग में कैसे परिवर्तित करते हैं?


2
हमें यह जानना होगा कि आप किस पायथन संस्करण का उपयोग कर रहे हैं, और यह क्या है कि आप यूनिकोड स्ट्रिंग कह रहे हैं। एक छोटी यूनिकोड_स्ट्रिंग पर निम्नलिखित करें जिसमें मुद्रा प्रतीक शामिल हैं जो परेशान कर रहे हैं: पायथन 2.x: print type(unicode_string), repr(unicode_string)पायथन 3.x: print type(unicode_string), ascii(unicode_string)फिर अपना प्रश्न संपादित करें और उपरोक्त प्रिंट स्टेटमेंट के परिणामों को कॉपी / पेस्ट करें। परिणामों को फिर से न लिखें। अपने HTML के शीर्ष के पास भी देखें और देखें कि क्या आप ऐसा कुछ पा सकते हैं: <meta http-equiv = "Content-Type" सामग्री = "text / html; charset = iso-8859
John Machin

3
मुझे संदेह है कि आप एक वेब अनुरोध से यूनिकोड प्राप्त करते हैं। आप मौखिक रूप से UTF-8 को यूनीकोड ​​में मिला सकते हैं।

28
@ लुट्ज़: "यूटीएफ -8 एनकोडेड यूनिकोड" वास्तव में यूनिकोड नहीं है?
jalf

2
आपको वास्तव में स्पष्ट करना चाहिए कि यूनिकोड स्ट्रिंग और अजगर स्ट्रिंग (ठोस उदाहरण देने से मुझे सबसे अच्छा क्या लगता है) का मतलब होगा क्योंकि यह टिप्पणियों से स्पष्ट है कि आपके प्रश्न की विभिन्न व्याख्याएं हैं। मुझे आश्चर्य है कि आपने ऐसा क्यों नहीं किया है क्योंकि यह सवाल पूछे जाने के बाद 3,5 साल से अधिक हो गए हैं।
पायोत्र दोब्रोगोस्ट

6
@ जालफ: अगर यह एनकोडेड है ; यह अब यूनिकोड जैसे नहीं है,unicode_string = u"I'm unicode string"; bytestring = unicode_string.encode('utf-8'); unicode_again = bytestring.decode('utf-8')
JFS

जवाबों:


572

देख unicodedata.normalize

title = u"Klüft skräms inför på fédéral électoral große"
import unicodedata
unicodedata.normalize('NFKD', title).encode('ascii', 'ignore')
'Kluft skrams infor pa federal electoral groe'

24
+1 के रूप में इस प्रश्न का उत्तर दिया गया है, @ विलियम्सग्रुप की फाइल को यूनिकोड से बचाने में सक्षम नहीं होने की समस्या एक अलग प्रश्न के योग्य पूरी तरह से अलग मुद्दे की तरह लगती है
मार्क रोडी

5
@ जॉन - यह जवाब ओपी के स्पष्टीकरण को दर्शाता है।
डोमिनिक रॉगर

10
@ मार्क रॉडी: उनका प्रश्न यह है कि लिखा गया है कि "यूनिकोड स्ट्रिंग" (वह जो भी मतलब हो) को "पाइथन स्ट्रिंग" (जो भी हो ...) के लिए कुछ मुद्रा प्रतीकों में परिवर्तित करना है और आपको लगता है कि एक हटाने-कुछ-डायटिक्स डिलीट-अदर-नॉन-अस्की कैरेक्ट्स कीचड़ उसके सवाल का जवाब देता है ???
जॉन मैकिन

13
@JohnMachin यह शब्द के लिए प्रश्न शब्द का उत्तर देता है: स्ट्रिंग को एक में बदलने का एकमात्र तरीका ASCII में प्रतिनिधित्व नहीं किए जा सकने वाले वर्णों को ड्रॉप या परिवर्तित करना है। तो + क मुझसे। unicodestr
इज़काता

4
@lzkata: नहीं, यह नहीं है। type(title) == unicode and type(title.encode('utf-8')) == str। इनपुट को भ्रष्ट करने की आवश्यकता नहीं है, एक बाइटस्ट्रिंग प्राप्त करने के लिए जिसे किसी फ़ाइल में सहेजा जा सकता है।
jfs

318

यदि आप गैर- ASCII वर्णों का अनुवाद करने की आवश्यकता नहीं है, तो आप ASCII को एनकोड का उपयोग कर सकते हैं:

>>> a=u"aaaàçççñññ"
>>> type(a)
<type 'unicode'>
>>> a.encode('ascii','ignore')
'aaa'
>>> a.encode('ascii','replace')
'aaa???????'
>>>

4
बहुत बढ़िया जवाब। बिल्कुल वही जो मुझे चाहिए था। इसके अलावा, ignoreबनामreplace
जॉनी ब्रूक्स

या a.encode('ascii', 'xmlcharrefreplace')देता है 'aaa&#224;&#231;&#231;&#231;&#241;&#241;&#241;'
बॉब स्टीन

type(a)है strपायथन 3.6.8 में और किसी भी जरूरत नहीं है encode()विधि।
अली तू

138
>>> text=u'abcd'
>>> str(text)
'abcd'

यदि स्ट्रिंग में केवल एएससीआई अक्षर हैं।


18
यह केवल खिड़कियों पर काम करेगा। और गैर-अस्की प्रतीक हैं तो टूट जाएगा।
वानुआन

6
यह टूट जाता है यदि स्ट्रिंग की सामग्री वास्तव में यूनिकोड है, न कि केवल यूनिकोड स्ट्रिंग में एस्की अक्षर। ऐसा न करें, आपको पूरे स्थान पर रैंडम यूनिकोडेकोडकोड के अपवाद मिलेंगे।
डग

11
इस जवाब से मुझे मदद मिली। यदि आप जानते हैं कि आपकी स्ट्रिंग एससीआई है और आपको इसे एक गैर-यूनिकोड स्ट्रिंग पर वापस लाने की आवश्यकता है, तो यह बहुत उपयोगी है।
वेदटोपकर

113

यदि आपके पास एक यूनिकोड स्ट्रिंग है, और आप इसे एक फ़ाइल, या अन्य क्रमबद्ध रूप में लिखना चाहते हैं, तो आपको पहले इसे एक विशेष प्रतिनिधित्व में एनकोड करना होगा जिसे संग्रहीत किया जा सकता है। कई सामान्य यूनिकोड एनकोडिंग हैं, जैसे कि UTF-16 (अधिकांश यूनिकोड वर्णों के लिए दो बाइट्स का उपयोग करता है) या UTF-8 (वर्ण के आधार पर 1-4 बाइट्स / कोडपॉइंट), आदि उस स्ट्रिंग को किसी विशेष एन्कोडिंग में बदलने के लिए, आप उपयोग कर सकते हैं:

>>> s= u'£10'
>>> s.encode('utf8')
'\xc2\x9c10'
>>> s.encode('utf16')
'\xff\xfe\x9c\x001\x000\x00'

बाइट्स के इस कच्चे स्ट्रिंग को एक फ़ाइल में लिखा जा सकता है। हालाँकि, ध्यान दें कि इसे वापस पढ़ते समय, आपको पता होना चाहिए कि इसमें कौन सी एन्कोडिंग है और उसी एन्कोडिंग का उपयोग करके इसे डीकोड करें।

फ़ाइलों को लिखते समय, आप कोडेक्स मॉड्यूल का उपयोग करके इस मैनुअल एनकोड / डिकोड प्रक्रिया से छुटकारा पा सकते हैं । इसलिए, यूटीएफ -8 में सभी यूनिकोड स्ट्रिंग्स को एनकोड करने वाली फाइल को खोलने के लिए उपयोग करें:

import codecs
f = codecs.open('path/to/file.txt','w','utf8')
f.write(my_unicode_string)  # Stored on disk as UTF-8

ध्यान दें कि इन फ़ाइलों का उपयोग करने वाले किसी और चीज़ को समझना चाहिए कि यदि वे उन्हें पढ़ना चाहते हैं तो फ़ाइल को एन्कोडिंग क्या है। यदि आप केवल पढ़ने / लिखने का काम कर रहे हैं, तो यह कोई समस्या नहीं है, अन्यथा सुनिश्चित करें कि आप फ़ाइलों को उपयोग करने वाले किसी अन्य द्वारा समझने योग्य रूप में लिखते हैं।

पायथन 3 में, फ़ाइल एक्सेस का यह रूप डिफ़ॉल्ट है, और अंतर्निहित openफ़ंक्शन एन्कोडिंग पैरामीटर लेगा और टेक्स्ट मोड में खोली गई फ़ाइलों के लिए यूनिकोड स्ट्रिंग्स (पायथन 3 में डिफ़ॉल्ट स्ट्रिंग ऑब्जेक्ट) से हमेशा अनुवाद / / करेगा।


58

यहाँ एक उदाहरण है:

>>> u = u'€€€'
>>> s = u.encode('utf8')
>>> s
'\xe2\x82\xac\xe2\x82\xac\xe2\x82\xac'

1
क्या कोई समझा सकता है कि जब मैं यूरो प्रतीक को utf8यहां दिखाए गए अनुसार सांकेतिक शब्दों में बदलना चाहता हूं , तो परिणाम केवल प्रश्न चिह्न है? यहां मेरे पायथन की एक छवि है, संस्करण 2.7.13। (मैं अन्य यूनिकोड वस्तुओं को सांकेतिक शब्दों में बदलना कर सकता हूं u"Klüft", लेकिन यूरो नहीं?)
लाल मटर

5

ठीक है, यदि आप अजगर 3 पर स्विच करने के लिए तैयार / तैयार हैं (जो कि आप कुछ पायथन 2 कोड के साथ पीछे की असंगति के कारण नहीं हो सकते हैं), तो आपको कोई परिवर्तित करने की आवश्यकता नहीं है; पायथन 3 के सभी पाठों को यूनिकोड स्ट्रिंग्स के साथ दर्शाया गया है, जिसका अर्थ यह भी है कि इसका अधिक उपयोग नहीं हैu'<text>' वाक्य रचना । आपके पास भी क्या हैं, वास्तव में, बाइट्स के तार, जो डेटा का प्रतिनिधित्व करने के लिए उपयोग किए जाते हैं (जो एक एन्कोडेड स्ट्रिंग हो सकता है)।

http://docs.python.org/3.1/whatsnew/3.0.html#text-vs-data-instead-of-unicode-vs-8-bit

(बेशक, अगर आप वर्तमान में पायथन 3 का उपयोग कर रहे हैं, तो समस्या यह है कि आप पाठ को फ़ाइल में सहेजने का प्रयास कर रहे हैं।


2
पायथन में 3 स्ट्रिंग्स यूनिकोड स्ट्रिंग्स हैं। वे कभी एनकोडेड नहीं होते। मुझे निम्नलिखित पाठ उपयोगी लगे: joelonsoftware.com/articles/Unicode.html

वह इसे एक फ़ाइल में सहेजना चाहता है; आपका जवाब कैसे मदद करता है?
जॉन मैकिन

@lutz: ठीक है, मैं भूल गया था कि यूनिकोड एक एन्कोडिंग के बजाय एक चरित्र मानचित्र है। @ जॉन: इस समय यह जानने के लिए पर्याप्त जानकारी नहीं है कि इसे सहेजने में क्या समस्या है। क्या उसे कोई त्रुटि हो रही है? क्या उसे कोई त्रुटि नहीं मिल रही है, लेकिन बाहरी रूप से फ़ाइल खोलने पर वह मोजिबेक हो जाता है? उस जानकारी के बिना, बहुत अधिक संभव समाधान हैं जो प्रदान किए जा सकते हैं।
JAB

@ कैट: इस समय कोई जानकारी नहीं है कि उसे क्या मिला है, अकेले जाने दें कि उसकी बचत की समस्या क्या है। मैंने उसे कुछ तथ्य प्रदान करने के लिए कहा है - मेरा उत्तर देखें।
जॉन मैकिन

5

यहाँ एक उदाहरण कोड है

import unicodedata    
raw_text = u"here $%6757 dfgdfg"
convert_text = unicodedata.normalize('NFKD', raw_text).encode('ascii','ignore')

यह उत्तर स्वीकृत उत्तर से कैसे भिन्न है?
सगौरी

3

फ़ाइल में यूनिकोड-एसैपेड स्ट्रिंग है

\"message\": \"\\u0410\\u0432\\u0442\\u043e\\u0437\\u0430\\u0446\\u0438\\u044f .....\",

मेरे लिए

 f = open("56ad62-json.log", encoding="utf-8")
 qq=f.readline() 

 print(qq)                          
 {"log":\"message\": \"\\u0410\\u0432\\u0442\\u043e\\u0440\\u0438\\u0437\\u0430\\u0446\\u0438\\u044f \\u043f\\u043e\\u043b\\u044c\\u0437\\u043e\\u0432\\u0430\\u0442\\u0435\\u043b\\u044f\"}

(qq.encode().decode("unicode-escape").encode().decode("unicode-escape")) 
# '{"log":"message": "Авторизация пользователя"}\n'

2
यहां तक ​​कि अगर मैंने केवल उपयोग किया तो भी यह काम किया:result.encode().decode('unicode-escape')
अम्माद खालिद

0

किसी भी उत्तरदाता ने मेरे मामले के लिए काम नहीं किया, जहां मेरे पास एक स्ट्रिंग चर था जिसमें यूनिकोड वर्ण थे, और किसी भी एन्कोड-डिकोड के बारे में यहां नहीं बताया गया था।

अगर मैं एक टर्मिनल में करता हूं

echo "no me llama mucho la atenci\u00f3n"

या

python3
>>> print("no me llama mucho la atenci\u00f3n")

आउटपुट सही है:

output: no me llama mucho la atención

लेकिन इस स्ट्रिंग चर को लोड करने वाली स्क्रिप्ट के साथ काम नहीं किया।

यह वही है जो मेरे मामले में काम करता है, यदि कोई मामले में मदद करता है:

string_to_convert = "no me llama mucho la atenci\u00f3n"
print(json.dumps(json.loads(r'"%s"' % string_to_convert), ensure_ascii=False))
output: no me llama mucho la atención

आपको
बजे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.