यूनिकोडेनाकोड: 'ascii' कोडक चरित्र u '\ xa0 को 20 की स्थिति में सांकेतिक शब्दों में बदलना नहीं कर सकता है: क्रम में नहीं (128)


1296

मुझे विभिन्न वेब पृष्ठों (विभिन्न साइटों पर) से प्राप्त पाठ के यूनिकोड वर्णों से निपटने में समस्याएँ आ रही हैं। मैं सुंदर का उपयोग कर रहा हूँ।

समस्या यह है कि त्रुटि हमेशा प्रतिलिपि प्रस्तुत करने योग्य नहीं होती है; यह कभी-कभी कुछ पृष्ठों के साथ काम करता है, और कभी-कभी, यह फेंकने से बारफ हो जाता है UnicodeEncodeError। मैंने हर उस चीज़ के बारे में कोशिश की है जिसके बारे में मैं सोच सकता हूँ, और फिर भी मुझे ऐसा कुछ भी नहीं मिला है जो बिना किसी प्रकार की यूनिकोड-संबंधी त्रुटि को फेंकने के बिना लगातार काम करता हो।

समस्याओं के कारण कोड का एक भाग नीचे दिखाया गया है:

agent_telno = agent.find('div', 'agent_contact_number')
agent_telno = '' if agent_telno is None else agent_telno.contents[0]
p.agent_info = str(agent_contact + ' ' + agent_telno).strip()

जब स्निपेट को ऊपर चलाया जाता है, तो कुछ स्टिंग्स पर एक स्टैक ट्रेस उत्पन्न होता है:

Traceback (most recent call last):
  File "foobar.py", line 792, in <module>
    p.agent_info = str(agent_contact + ' ' + agent_telno).strip()
UnicodeEncodeError: 'ascii' codec can't encode character u'\xa0' in position 20: ordinal not in range(128)

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

क्या किसी के पास कोई विचार है कि इसे कैसे हल किया जाए ताकि मैं इस समस्या को ठीक कर सकूं?


1
यदि आप एक डेवलपर के बजाय एक उपयोगकर्ता के रूप में ये त्रुटियां प्राप्त कर रहे हैं, तो serverfault.com/questions/54591/… और checkubuntu.com/questions/599808/… पर
वह ब्राजील के लड़के

मैं इस बात का उपयोग इस सामान के लिए onlinegdb.com/online_python_interpreter से नहीं करूँगा । सामान की जांच करने के लिए उस दुभाषिए का उपयोग कर रहा था और यह यूनिकोड के लिए सही ढंग से कॉन्फ़िगर नहीं किया गया है! हमेशा एक प्रारूप 'B' \ nnn '' में छप रहा था ... जब मैं चाहता था कि सभी एक गुलेल थे! एक वीएम पर कोशिश की और यह chr ()
JGFMK

4
यह कोशिश करो import os; import locale; os.environ["PYTHONIOENCODING"] = "utf-8"; myLocale=locale.setlocale(category=locale.LC_ALL, locale="en_GB.UTF-8"); ... print(myText.encode('utf-8', errors='ignore'))
hhh

@hhh मैं भागा अपने टुकड़ा NameError: नाम 'myText' परिभाषित नहीं है
खान इरफान

9
अपनी स्क्रिप्ट निष्पादित करने से पहले शेल में PYTHONIOENCODING सेट करने का प्रयास करें :$ export PYTHONIOENCODING=utf8
Noam Manos

जवाबों:


1361

आपको पायथन यूनिकोड HOWTO को पढ़ने की आवश्यकता है । यह त्रुटि बहुत पहला उदाहरण है

मूल रूप से, strयूनिकोड से एन्कोडेड टेक्स्ट / बाइट्स में बदलने के लिए उपयोग करना बंद करें ।

इसके बजाय, .encode()स्ट्रिंग को एन्कोड करने के लिए ठीक से उपयोग करें:

p.agent_info = u' '.join((agent_contact, agent_telno)).encode('utf-8').strip()

या पूरी तरह से यूनिकोड में काम करते हैं।


23
माना! अंगूठे का एक अच्छा नियम मुझे सिखाया गया था कि "यूनिकोड सैंडविच" विचार का उपयोग करें। आपकी स्क्रिप्ट बाहरी दुनिया से बाइट स्वीकार करती है, लेकिन सभी प्रसंस्करण यूनिकोड में किए जाने चाहिए। केवल जब आप अपने डेटा को आउटपुट करने के लिए तैयार होते हैं तो इसे वापस बाइट्स में डालना चाहिए!
एंडब्रीड

255
यदि कोई व्यक्ति इससे भ्रमित हो जाता है, तो मुझे एक अजीब बात मिली: मेरा टर्मिनल utf-8 का उपयोग करता है, और जब मैं printअपना utf-8 तार लगाता हूं तो यह अच्छी तरह से काम करता है। हालाँकि जब मैं अपने प्रोग्राम आउटपुट को किसी फ़ाइल में पाइप करता हूं, तो वह ए UnicodeEncodeError। वास्तव में, जब आउटपुट पुनर्निर्देशित होता है (एक फ़ाइल या एक पाइप के लिए), मुझे लगता है कि sys.stdout.encodingहै None! .encode('utf-8')समस्या को हल करने पर tacking ।
drevicko

93
@drevicko: PYTHONIOENCODING=utf-8इसके बजाय इसका उपयोग करें , यूनिकोड स्ट्रिंग्स प्रिंट करें और पर्यावरण को अपेक्षित एन्कोडिंग सेट करने दें।
jfs

1
@ आंसर: हर मामले में कुछ भी मान्य नहीं है। सामान्य तौर पर, एक उपयोगकर्ता को यह ध्यान नहीं देना चाहिए कि आप अपनी उपयोगिता को लागू करने के लिए पायथन का उपयोग करते हैं (यदि आप किसी अन्य कारण से इसे किसी अन्य भाषा में पुन: लागू करने का निर्णय लेते हैं तो इंटरफ़ेस को बदलना नहीं चाहिए) और इसलिए आपको उस उपयोगकर्ता से अजगर के बारे में भी जानकारी की उम्मीद नहीं करनी चाहिए- विशिष्ट दूत। चरित्र एन्कोडिंग निर्दिष्ट करने के लिए उपयोगकर्ता को मजबूर करने के लिए यह बुरा यूआई है; यदि आवश्यक हो तो रिपोर्ट प्रारूप में वर्ण एन्कोडिंग एम्बेड करें। नोट: कोई हार्डकोड एन्कोडिंग सामान्य मामले में "समझदार डिफ़ॉल्ट" नहीं हो सकती है।
JFS

13
यह बुरी और भ्रमित करने वाली सलाह है। लोग इसका उपयोग करते हैं इसका कारण यह है कि वस्तु पहले से ही एक स्ट्रिंग नहीं है, इसलिए .encode()कॉल करने की कोई विधि नहीं है ।
सेरिन ऑक्ट

433

यह एक क्लासिक अजगर यूनिकोड दर्द बिंदु है! निम्नलिखित को धयान मे रखते हुए:

a = u'bats\u00E0'
print a
 => batsà

अब तक सभी अच्छे हैं, लेकिन अगर हम str (a) कहते हैं, तो देखते हैं कि क्या होता है:

str(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe0' in position 4: ordinal not in range(128)

ओह डुबकी, यह किसी को भी अच्छा करने वाला नहीं है! त्रुटि को ठीक करने के लिए, बाइट्स को स्पष्ट रूप से .encode के साथ एनकोड करें और अजगर को बताएं कि किस कोडेक का उपयोग करना है:

a.encode('utf-8')
 => 'bats\xc3\xa0'
print a.encode('utf-8')
 => batsà

Voil \ u00E0!

मुद्दा यह है कि जब आप str () कहते हैं, तो अजगर आपके द्वारा दिए गए बाइट्स को आज़माने और उन्हें एनकोड करने के लिए डिफ़ॉल्ट वर्ण एन्कोडिंग का उपयोग करता है, जो आपके मामले में कभी-कभी यूनिकोड वर्णों का प्रतिनिधित्व करते हैं। समस्या को ठीक करने के लिए, आपको अजगर को यह बताना होगा कि स्ट्रिंग का उपयोग करके आप इसे कैसे दे सकते हैं ।encode ('जो कुछ भी हो')। अधिकांश समय, आपको utf-8 का उपयोग करके ठीक होना चाहिए।

इस विषय पर एक उत्कृष्ट प्रदर्शनी के लिए, नेड बैचेलेडर के PyCon को यहां देखें: http://nedbatchelder.com/text/unipain.html


85
व्यक्तिगत टिप्पणी: जब ".encode" गलती से टाइप न करें ".unicode" टाइप करने की कोशिश कर रहा है, तो आश्चर्य है कि कुछ भी क्यों काम नहीं कर रहा है।
Huffman

9
अच्छी सलाह। लेकिन आप इसके बजाय क्या करते हैं जब आप str (x) का उपयोग उन वस्तुओं को प्रिंट करने के लिए करते हैं जो तार हो सकते हैं या नहीं हो सकते हैं? str (x) कार्य करता है यदि x एक संख्या, दिनांक समय, बूलियन या सामान्य स्ट्रिंग है। अचानक अगर उसका यूनिकोड काम करना बंद कर देता है। क्या समान व्यवहार प्राप्त करने का कोई तरीका है या क्या अब हमें परीक्षण करने के लिए एक IF जांच जोड़ने की आवश्यकता है यदि वस्तु .encode, और str का उपयोग करने के लिए स्ट्रिंग है (अन्यथा)?
डिर्क R

Noneमूल्य के साथ एक ही सवाल पूछा जा सकता है ।
13

210

मैंने प्रतीकों को हटाने के लिए अपने चारों ओर सुरुचिपूर्ण काम पाया और स्ट्रिंग को स्ट्रिंग के रूप में जारी रखना जारी रखा:

yourstring = yourstring.encode('ascii', 'ignore').decode('ascii')

यह ध्यान रखना महत्वपूर्ण है कि अनदेखा विकल्प का उपयोग करना खतरनाक है क्योंकि यह चुपचाप किसी भी यूनिकोड (और अंतर्राष्ट्रीयकरण) को उस कोड का समर्थन करता है जो इसका उपयोग करता है, जैसा कि यहां देखा गया है (यूनिकोड में कनवर्ट करें):

>>> u'City: Malmö'.encode('ascii', 'ignore').decode('ascii')
'City: Malm'

17
आपने मेरा दिन बना दिया! yourstring = yourstring.encode('utf-8', 'ignore').decode('utf-8')
Utf

मेरे लिए यह काम किया था, लेकिन मेरा मामला अलग था, मैं फ़ाइल नामों को सहेज रहा था और नाम में "/" था और पथ मौजूद नहीं था इसलिए मुझे .replace ("/", "") का उपयोग करना होगा और इस प्रकार बचाया गया। मेरी स्क्रिप्ट। Ascii की अनदेखी करते हुए 'utf-8' केस के लिए भी काम करता है।
आकाश कांडपाल

1
फ़ाइल पथ को सही ढंग से उपयोग करने के लिए @ harrypotter0 os.path.join(), जब आप क्रॉस-प्लेटफ़ॉर्म प्रोग्रामिंग करना शुरू करते हैं तो यह बहुत अच्छी आदत है। :)
login_not_failed

152

अच्छी तरह से मैं सब कुछ करने की कोशिश की, लेकिन यह मदद नहीं की, चारों ओर googling के बाद मैं निम्नलिखित लगा और यह मदद की। अजगर 2.7 उपयोग में है।

# encoding=utf8
import sys
reload(sys)
sys.setdefaultencoding('utf8')

7
यह मत करो। stackoverflow.com/questions/3828723/… , हालाँकि जब आपके पास इस stackoverflow.com/a/31137935/2141635 परिणामों के शीर्ष के पास जब आप त्रुटि की खोज करते हैं तो मैं देख सकता हूं कि यह एक अच्छे विचार की तरह क्यों हो सकता है।
पादरी कनिंघम

21
मैंने इस विषय में लगभग सभी सुझावों की कोशिश की और वास्तव में मेरे लिए कोई काम नहीं किया। अंत में मैंने यह कोशिश की। और यह वास्तव में केवल एक है जो सरल और अच्छा काम करता है। अगर कोई कहता है "ऐसा मत करो, तो एक सरल समाधान के साथ आओ। अन्यथा इस का उपयोग करें। क्योंकि यह एक अच्छा काम करने वाला प्रतिलिपि और अतीत का समाधान है।
रिचर्ड डे री

4
यह python3 में कैसे किया जा सकता है? जानकर खुशी होगी।
कनावेर पीटर

3
इतनी निराशा के बाद यह काम किया। बहुत बहुत धन्यवाद।
अवराम झुरबा

4
मैं सिर्फ एक जोड़ सकता हूँif sys.version_info.major < 3:
प्रो। फाल्कन कॉन्ट्रैक्ट का उल्लंघन

87

एक सूक्ष्म समस्या जिसके कारण प्रिंट भी विफल हो रहा है, आपके पर्यावरण चर गलत, सेट कर रहे हैं। यहाँ LC_ALL "C" पर सेट है। डेबियन में वे इसे स्थापित करने को हतोत्साहित करते हैं: लोकेल पर डेबियन विकि

$ echo $LANG
en_US.utf8
$ echo $LC_ALL 
C
$ python -c "print (u'voil\u00e0')"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe0' in position 4: ordinal not in range(128)
$ export LC_ALL='en_US.utf8'
$ python -c "print (u'voil\u00e0')"
voilà
$ unset LC_ALL
$ python -c "print (u'voil\u00e0')"
voilà

वास्तव में एक ही मुद्दा मिला, इतना बुरा कि मैंने रिपोर्ट करने से पहले इसकी जाँच नहीं की । बहुत बहुत धन्यवाद। वैसे, आप पहले दो कमांड को बदल सकते हैं env|grep -E '(LC|LANG)'
दिमित्री वेरहुतोवोव

गलत एन्कोडिंग मुद्दे पर सिर्फ मेरे दो सेंट। मैं अक्सर mc"सबशेल मोड" ( Ctrl-O) का उपयोग करता हूं और मैं यह भी भूल गया कि मैंने निम्नलिखित उपनाम को बैश में जोड़ा है alias mc="LANG=en_EN.UTF-8 mc":। इसलिए जब मैंने खराब लिखी गई स्क्रिप्ट को चलाने की कोशिश की ru_RU.UTF-8, जो आंतरिक रूप से निर्भर करती है , तो वे बस मर जाते हैं। इससे पहले कि मैं असली मुद्दे की खोज में इस थ्रेड से बहुत सारे सामान की कोशिश की। :)
login_not_failed

आप कमाल के है। GSUTIL में, इस समस्या के कारण मेरा rsync विफल हो रहा था। फिक्स्ड LC_ALL और सब कुछ शराब के रूप में ठीक काम करता है। <3 THANK YOU <3
dsignr

27

मेरे लिए, जो काम किया गया था:

BeautifulSoup(html_text,from_encoding="utf-8")

आशा है कि यह किसी की मदद करता है।


25

मैंने वास्तव में पाया है कि मेरे अधिकांश मामलों में, बस उन पात्रों को अलग करना बहुत सरल है:

s = mystring.decode('ascii', 'ignore')

26
"परफेक्टली" आमतौर पर ऐसा नहीं होता है। यह सामान को फेंक देता है जिसे आपको यह पता लगाना चाहिए कि ठीक से कैसे निपटना है।
ट्रिपलए

7
बस "उन" (गैर-अंग्रेजी) वर्णों को छीन लेना, समाधान नहीं है क्योंकि अजगर को उन सभी भाषाओं का समर्थन करना चाहिए जो आपको नहीं लगता?
अनामल

8
Downvoted। यह बिल्कुल सही समाधान नहीं है। यूनिकोड के साथ काम करना सीखें: joelonsoftware.com/articles/Unicode.html
एंड्रयू फेरियर

4
देखिए, इस विशेष उत्तर को प्रस्तुत करने का सबसे विवेकपूर्ण तरीका इस प्रकार है: यह पहचानना कि असिसी कुछ भाषाओं और उपयोगकर्ताओं पर एक निश्चित विशेषाधिकार प्रदान करता है - यह हैच हैच उन उपयोगकर्ताओं के लिए शोषण किया जा सकता है जो एक सरसरी हैकिंग कर सकते हैं, पहले पास , स्क्रिप्ट पूरी तरह से प्रारंभिक यूनिकोड समर्थन लागू होने से पहले प्रारंभिक कार्य के लिए।
lol

5
अगर मैं एक स्क्रिप्ट लिख रहा हूं, जिसे आंतरिक कंपनी एप्लिकेशन में stdout करने के लिए सिर्फ अंग्रेजी पाठ को प्रिंट करने की आवश्यकता है, तो मैं चाहता हूं कि समस्या दूर हो जाए। जो कुछ भी काम करता है।
kagronick

25

समस्या यह है कि आप एक यूनिकोड वर्ण मुद्रित करने का प्रयास कर रहे हैं, लेकिन आपका टर्मिनल इसका समर्थन नहीं करता है।

आप इसे language-pack-enठीक करने के लिए पैकेज स्थापित करने का प्रयास कर सकते हैं :

sudo apt-get install language-pack-en

जो सभी समर्थित पैकेजों (पायथन सहित) के लिए अंग्रेजी अनुवाद डेटा अपडेट प्रदान करता है। यदि आवश्यक हो (जो वर्ण आप मुद्रित करने का प्रयास कर रहे हैं) के अनुसार भिन्न भाषा पैकेज स्थापित करें।

कुछ लिनक्स वितरण पर यह सुनिश्चित करने के लिए आवश्यक है कि डिफ़ॉल्ट अंग्रेजी स्थान ठीक से सेट-अप हैं (इसलिए यूनिकोड वर्ण शेल / टर्मिनल द्वारा नियंत्रित किए जा सकते हैं)। कभी-कभी इसे मैन्युअल रूप से कॉन्फ़िगर करने की तुलना में इसे स्थापित करना आसान होता है।

फिर कोड लिखते समय, सुनिश्चित करें कि आप अपने कोड में सही एन्कोडिंग का उपयोग करते हैं।

उदाहरण के लिए:

open(foo, encoding='utf-8')

यदि आपको अभी भी कोई समस्या है, तो अपने सिस्टम कॉन्फ़िगरेशन को दोबारा जांचें, जैसे:

  • आपकी लोकेल फ़ाइल ( /etc/default/locale), जिसमें उदाहरण होना चाहिए

    LANG="en_US.UTF-8"
    LC_ALL="en_US.UTF-8"

    या:

    LC_ALL=C.UTF-8
    LANG=C.UTF-8
  • LANG/ LC_CTYPEशेल में मूल्य ।

  • जाँच करें कि आपका शेल किस लोकेल का समर्थन करता है:

    locale -a | grep "UTF-8"

ताजा वीएम में समस्या और समाधान का प्रदर्शन।

  1. VM को प्रारंभ करें और उसका प्रावधान करें (उदाहरण के लिए vagrant):

    vagrant init ubuntu/trusty64; vagrant up; vagrant ssh

    देखें: उपलब्ध उबंटू बॉक्स

  2. मुद्रण यूनिकोड वर्ण (जैसे ट्रेड मार्क साइन जैसे ):

    $ python -c 'print(u"\u2122");'
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
    UnicodeEncodeError: 'ascii' codec can't encode character u'\u2122' in position 0: ordinal not in range(128)
  3. अब स्थापित हो रहा है language-pack-en:

    $ sudo apt-get -y install language-pack-en
    The following extra packages will be installed:
      language-pack-en-base
    Generating locales...
      en_GB.UTF-8... /usr/sbin/locale-gen: done
    Generation complete.
  4. अब समस्या हल होनी चाहिए:

    $ python -c 'print(u"\u2122");'
    
  5. अन्यथा, निम्न आदेश आज़माएँ:

    $ LC_ALL=C.UTF-8 python -c 'print(u"\u2122");'
    

1
language-pack-enपायथन या इस प्रश्न के साथ क्या करने के लिए मिला है? AFAIK, यह संदेशों को भाषा अनुवाद प्रदान कर सकता है, लेकिन एन्कोडिंग के साथ कोई लेना-देना नहीं है
एलेस्टेयर मैककॉर्मैक

2
कुछ लिनक्स वितरण पर यह सुनिश्चित करने के लिए आवश्यक है कि डिफ़ॉल्ट अंग्रेजी स्थानों को ठीक से सेट किया गया है, खासकर जब टर्मिनल पर पायथन स्क्रिप्ट चल रही हो। यह मेरे लिए एक बिंदु पर काम करता है। देखें: चरित्र एन्कोडिंग
kenorb

आह अच्छा। आप मतलब है अगर आप एक गैर अंग्रेजी लोकेल का उपयोग करना चाहते हैं? मुझे लगता है कि उपयोगकर्ता को यह /etc/locale.genसुनिश्चित करने के लिए संपादन करना होगा कि इसका उपयोग करने से पहले उनका लोकेल बनाया गया है?
एलेस्टेयर मैककॉर्मैक

1
@AlastairMcCormack बाहर टिप्पणी की LANGसे /etc/default/locale(के रूप में /etc/locale.genऔर भाग शामिल नहीं है मौजूद हैं) locale-gen, लेकिन उसने ऐसा नहीं किया मदद करते हैं। मुझे यकीन नहीं है कि language-pack-enवास्तव में क्या होता है, क्योंकि मुझे बहुत प्रलेखन नहीं मिला और इसकी सामग्री को सूचीबद्ध करने से बहुत मदद नहीं मिली।
kenorb

1
यह संभावना नहीं है कि डेस्कटॉप सिस्टम पर पहले से ही कोई utf-8 स्थान नहीं हैं, यानी, यह संभावना है कि आपको कुछ भी स्थापित करने की आवश्यकता नहीं है, बस कॉन्फ़िगर करें LANG/ LC_CTYPE/ LC_ALLबजाय (जैसे, LANG=C.UTF-8)।
JFS

19

खोल में:

  1. निम्नलिखित कमांड द्वारा समर्थित UTF-8 लोकेल खोजें:

    locale -a | grep "UTF-8"
  2. स्क्रिप्ट चलाने से पहले इसे निर्यात करें, जैसे:

    export LC_ALL=$(locale -a | grep UTF-8)

    या मैन्युअल रूप से पसंद है:

    export LC_ALL=C.UTF-8
  3. विशेष चरित्र को मुद्रित करके इसका परीक्षण करें, जैसे :

    python -c 'print(u"\u2122");'

ऊपर उबुन्टु में परीक्षण किया गया।


हाँ, यह सबसे अच्छा उत्तर है, हम उपयोग करने के लिए स्रोत कोड को संशोधित नहीं कर सकते ।encode
Luat Nguyen - Neo.Mxn0

16

अपनी स्क्रिप्ट की शुरुआत में (या दूसरी पंक्ति के रूप में) नीचे पंक्ति जोड़ें:

# -*- coding: utf-8 -*-

यह अजगर स्रोत कोड एन्कोडिंग की परिभाषा है। पीईपी 263 में अधिक जानकारी ।


2
यह समस्या का समाधान नहीं करता है जब बाहरी फ़ाइल से लोड संसाधित पाठ में utf-8 एन्कोडिंग होते हैं। यह केवल दिए गए अजगर लिपि में लिखे गए शाब्दिकों के लिए ही मदद करता है और केवल अजगर दुभाषिया के लिए एक सुराग है, लेकिन पाठ प्रसंस्करण पर कोई प्रभाव नहीं पड़ता है।
मिकेलब्लोमकविस्ट्सन

16

यहाँ कुछ अन्य तथाकथित "कॉप आउट" उत्तरों का पुनर्पाठ है। ऐसी स्थितियां हैं जिनमें बस परेशान करने वाले पात्रों / स्ट्रिंग्स को फेंकना एक अच्छा समाधान है, यहां विरोध के बावजूद आवाज उठाई गई है।

def safeStr(obj):
    try: return str(obj)
    except UnicodeEncodeError:
        return obj.encode('ascii', 'ignore').decode('ascii')
    except: return ""

इसका परीक्षण:

if __name__ == '__main__': 
    print safeStr( 1 ) 
    print safeStr( "test" ) 
    print u'98\xb0'
    print safeStr( u'98\xb0' )

परिणाम:

1
test
98°
98

सुझाव: आप इस फ़ंक्शन को toAsciiइसके बजाय नाम देना चाह सकते हैं ? यह प्राथमिकता का विषय है।

यह पायथन 2 के लिए लिखा गया था। पायथन 3 के लिए, मेरा मानना ​​है कि आप इसके bytes(obj,"ascii")बजाय उपयोग करना चाहते हैं str(obj)। मैंने अभी तक इसका परीक्षण नहीं किया है, लेकिन मैं कुछ बिंदु पर हूं और उत्तर को संशोधित करूंगा।


8

मैंने हमेशा पायथन फ़ाइलों की पहली दो पंक्तियों में नीचे कोड रखा:

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

6

सरल सहायक कार्य यहां मिलते हैं

def safe_unicode(obj, *args):
    """ return the unicode representation of obj """
    try:
        return unicode(obj, *args)
    except UnicodeDecodeError:
        # obj is byte string
        ascii_text = str(obj).encode('string_escape')
        return unicode(ascii_text)

def safe_str(obj):
    """ return the byte string representation of obj """
    try:
        return str(obj)
    except UnicodeEncodeError:
        # obj is unicode
        return unicode(obj).encode('unicode_escape')

फरार हुए बाइटस्ट्रिंग (मनमाने ढंग से यूनिकोड स्ट्रिंग को बाइट्स में एससीआई एन्कोडिंग का उपयोग करने के लिए) प्राप्त करने के लिए, आप backslashreplaceत्रुटि हैंडलर का उपयोग कर सकते हैं u'\xa0'.encode('ascii', 'backslashreplace'):। हालांकि आपको इस तरह के प्रतिनिधित्व से बचना चाहिए और अपने पर्यावरण को गैर-अस्की पात्रों के बजाय स्वीकार करने के लिए कॉन्फ़िगर करना चाहिए - यह 2016 है!
jfs

हैप्पी न्यू ईयर @JFSebastian। मैं सिर्फ पायथन-यूनिकोड मुद्दे से निराश हो गया और फिर अंत में यह समाधान मिला जो काम कर रहा था। मुझे इस बारे में पता नहीं था। वैसे भी टिप के लिए धन्यवाद।
पराग त्यागी -मोरफियस- 6


4

कृपया टर्मिनल खोलें और नीचे दिए गए कमांड को फायर करें:

export LC_ALL="en_US.UTF-8"

3

मैंने अभी निम्नलिखित प्रयोग किया है:

import unicodedata
message = unicodedata.normalize("NFKD", message)

इसके बारे में दस्तावेज़ीकरण क्या कहता है, इसकी जाँच करें:

unicodedata.normalize (फ़ॉर्म, unistr) यूनिकोड स्ट्रिंग unistr के लिए सामान्य फ़ॉर्म फ़ॉर्म लौटाएँ। फॉर्म के लिए मान्य मूल्य 'एनएफसी', 'एनएफकेसी', 'एनएफडी' और 'एनएफकेडी' हैं।

यूनिकोड मानक, यूनिकोड स्ट्रिंग के विभिन्न सामान्यीकरण रूपों को परिभाषित करता है, जो कैनोनिकल तुल्यता और संगतता तुल्यता की परिभाषा पर आधारित है। यूनिकोड में, कई पात्रों को विभिन्न तरीकों से व्यक्त किया जा सकता है। उदाहरण के लिए, चरित्र U + 00C7 (CEDILLA के साथ LATIN CAPITAL LETTER C) को U + 0043 (LATIN CAPITAL LETTER C) U + 0327 (COMBILING CEDILLA) अनुक्रम के रूप में भी व्यक्त किया जा सकता है।

प्रत्येक वर्ण के लिए, दो सामान्य रूप होते हैं: सामान्य रूप C और सामान्य रूप D. सामान्य रूप D (NFD) को विहित विघटन के रूप में भी जाना जाता है, और प्रत्येक वर्ण को अपने विघटित रूप में अनुवाद करता है। सामान्य रूप C (NFC) पहले एक विहित विघटन को लागू करता है, फिर पूर्व-संयुक्त वर्णों को फिर से बनाता है।

इन दो रूपों के अलावा, संगतता तुल्यता के आधार पर दो अतिरिक्त सामान्य रूप हैं। यूनिकोड में, कुछ वर्णों का समर्थन किया जाता है जो सामान्य रूप से अन्य वर्णों के साथ एकीकृत होते हैं। उदाहरण के लिए, U + 2160 (ROMAN NUMERAL ONE) वास्तव में U + 0049 (लेटिन कैपिटल लेटर I) के समान है। हालांकि, यह मौजूदा चरित्र सेटों (जैसे gb2312) के साथ संगतता के लिए यूनिकोड में समर्थित है।

सामान्य रूप केडी (NFKD) संगतता अपघटन को लागू करेगा, अर्थात सभी संगतता वर्णों को उनके समकक्षों के साथ बदल देगा। सामान्य रूप केसी (एनएफकेसी) पहले संगतता विघटन को लागू करता है, उसके बाद विहित रचना।

भले ही दो यूनिकोड के तार सामान्यीकृत हों और एक मानव पाठक के लिए समान हों, यदि एक में वर्णों का संयोजन है और दूसरा नहीं है, तो वे समान की तुलना नहीं कर सकते हैं।

यह मेरे लिए हल करती है। सरल और आसान।


3

नीचे समाधान मेरे लिए काम किया, बस जोड़ा गया

यू "स्ट्रिंग"

(स्ट्रिंग का यूनिकोड के रूप में प्रतिनिधित्व) मेरी स्ट्रिंग से पहले।

result_html = result.to_html(col_space=1, index=False, justify={'right'})

text = u"""
<html>
<body>
<p>
Hello all, <br>
<br>
Here's weekly summary report.  Let me know if you have any questions. <br>
<br>
Data Summary <br>
<br>
<br>
{0}
</p>
<p>Thanks,</p>
<p>Data Team</p>
</body></html>
""".format(result_html)

3

काश, यह पायथन 3 में कम से कम काम करता ...

अजगर ३

कभी-कभी त्रुटि एनवायरमेंट वैरिएबल और एनकोडिंग में होती है

import os
import locale
os.environ["PYTHONIOENCODING"] = "utf-8"
myLocale=locale.setlocale(category=locale.LC_ALL, locale="en_GB.UTF-8")
... 
print(myText.encode('utf-8', errors='ignore'))

एन्कोडिंग में त्रुटियों को अनदेखा किया जाता है।


2

मुझे बस यह समस्या थी, और Google ने मुझे यहां तक ​​पहुंचाया, इसलिए यहां सामान्य समाधानों को जोड़ने के लिए, यही मेरे लिए काम करता है:

# 'value' contains the problematic data
unic = u''
unic += value
value = unic

नेड की प्रस्तुति को पढ़ने के बाद मुझे यह विचार आया

मैं पूरी तरह से समझने का दावा नहीं करता कि यह क्यों काम करता है, हालांकि। इसलिए यदि कोई इस उत्तर को संपादित कर सकता है या समझाने के लिए टिप्पणी में डाल सकता है, तो मैं इसकी सराहना करूंगा।


3
typeमूल्य का क्या है ? इससे पहले और इसके बाद? मुझे लगता है कि यही कारण है कि काम करता है कि एक करके है unic += valueजो एक ही है, जैसा कि unic = unic + valueआप एक स्ट्रिंग और यूनिकोड, जहां अजगर तो उसके एवज में यूनिकोड मान लिया गया है जोड़ रहे हैं unicयानी अधिक सटीक प्रकार (के बारे में जब आप ऐसा करते हैं लगता है a = float(1) + int(1), aएक नाव हो जाता है) और तो value = unicकहते हैं valueनया करने के लिए unicवस्तु जो यूनिकोड होता है।
टॉम मायडेल्टन

2

जब हम चल रहे थे तब हमने इस त्रुटि को मारा manage.py migrateDjango में स्थानीयकृत जुड़नार के साथ ।

हमारे स्रोत में # -*- coding: utf-8 -*-घोषणा थी, MySQL को utf8 के लिए सही ढंग से कॉन्फ़िगर किया गया था और उबंटू में उपयुक्त भाषा पैक और मान थे/etc/default/locale

मुद्दा बस यह था कि Django कंटेनर (हम docker का उपयोग करते हैं) LANGenv var को याद नहीं कर रहा था ।

माइग्रेशन को फिर से चलाने से पहले कंटेनर LANGको सेट करना en_US.UTF-8और फिर से शुरू करना समस्या को निर्धारित करता है।


1

यहां कई जवाब (@agf और @Andbdrew उदाहरण के लिए) पहले ही ओपी प्रश्न के सबसे तत्काल पहलुओं को संबोधित कर चुके हैं।

हालांकि, मुझे लगता है कि एक सूक्ष्म लेकिन महत्वपूर्ण पहलू है जिसे काफी हद तक नजरअंदाज कर दिया गया है और यह उन सभी के लिए प्रिय रूप से मायने रखता है जो मेरे जैसे ही समाप्त हो गए हैं जबकि पायथन में एन्कोडिंग की भावना बनाने की कोशिश कर रहे हैं: पायथन 2 बनाम पायथन 3 के चरित्र प्रतिनिधित्व का प्रबंधन बेतहाशा अलग है । मुझे लगता है कि भ्रम का एक बड़ा हिस्सा है, जो कि पायथन में एन्कोडिंग के बारे में पढ़ने वाले लोगों के साथ बिना किसी संस्करण के बारे में पढ़े हुए है।

मेरा सुझाव है कि किसी को भी ओपी समस्या के मूल कारण को समझने में दिलचस्पी है, जो स्पोलस्की के चरित्र अभ्यावेदन और यूनिकोड के परिचय को पढ़कर शुरू होता है और फिर पायथन 2 और पायथन 3 में यूनिकोड पर बैटचेदर के लिए जाता है ।


हां, मेरी त्रुटि अजगर 2.7, 'a'.format (u'ñ') पर थी, और सही समाधान .encode ('utf-8') का उपयोग करने के लिए नहीं है, लेकिन हमेशा यूनिकोड स्ट्रिंग्स का उपयोग करें, (अजगर 3 में डिफ़ॉल्ट) ): u'a'format (u'ñ '),
रोजेलियो

1

चर को str (चर) में बदलने से बचने की कोशिश करें। कभी-कभी, यह समस्या का कारण हो सकता है।

बचने के सरल उपाय:

try: 
    data=str(data)
except:
    data = data #Don't convert to String

उपरोक्त उदाहरण एनकोड त्रुटि को भी हल करेगा।


यह काम नहीं करेगा क्योंकि आप केवल एक त्रुटि में भाग लेंगे सिवाय इसके
Aurele Collinet

0

यदि आपके पास ऐसा कुछ है packet_data = "This is data"तो इसे अगली पंक्ति में करें, प्रारंभ करने के ठीक बाद packet_data:

unic = u''
packet_data = unic

0

अजगर 3.0 और बाद के लिए अपडेट करें। अजगर संपादक में निम्नलिखित प्रयास करें:

locale-gen en_US.UTF-8
export LANG=en_US.UTF-8 LANGUAGE=en_US.en
LC_ALL=en_US.UTF-8

यह सिस्टम के डिफ़ॉल्ट लोकेल को UTF-8 प्रारूप में सेट करता है।

पीईपी 538 पर यहां और अधिक पढ़ा जा सकता है - एक सीएफ लोकल को यूटीएफ -8 स्थित लोकेल में ले जाना


0

मैं इस मुद्दे को यूनिकोड वर्णों के उत्पादन की कोशिश कर रहा था stdout, लेकिन साथsys.stdout.write प्रिंट के बजाय (ताकि मैं आउटपुट का समर्थन किसी अन्य फ़ाइल में भी कर सकूं)।

सुंदरसुपे के स्वयं के प्रलेखन से , मैंने इसे कोडेक्स लाइब्रेरी के साथ हल किया:

import sys
import codecs

def main(fIn, fOut):
    soup = BeautifulSoup(fIn)
    # Do processing, with data including non-ASCII characters
    fOut.write(unicode(soup))

if __name__ == '__main__':
    with (sys.stdin) as fIn: # Don't think we need codecs.getreader here
        with codecs.getwriter('utf-8')(sys.stdout) as fOut:
            main(fIn, fOut)

0

यह समस्या अक्सर तब होती है जब एक django परियोजना अपाचे का उपयोग कर तैनात करती है। क्योंकि अपाचे पर्यावरण चर LANG = C in / etc / sysconfig / httpd सेट करता है। बस फ़ाइल खोलें और टिप्पणी (या अपने फ़्लेवर को बदलें) यह सेटिंग। या WSGIDaemonProcess कमांड के लैंग विकल्प का उपयोग करें, इस मामले में आप अलग-अलग वर्चुअलहोस्ट करने के लिए अलग-अलग LANG वातावरण चर सेट करने में सक्षम होंगे।


0

अनुशंसित समाधान मेरे लिए काम नहीं करता था, और मैं सभी गैर एससीआई पात्रों को डंप करने के साथ रह सकता था, इसलिए

s = s.encode('ascii',errors='ignore')

जो मुझे कुछ छीन लिया है जो त्रुटियों को नहीं छोड़ता है।


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