Python Unicode-coderingsfout

Ik ben een Amazon XML-bestand aan het lezen en ontleden en terwijl het XML-bestand een ‘ toont, krijg ik de volgende foutmelding wanneer ik het probeer af te drukken:

'ascii' codec can't encode character u'\u2019' in position 16: ordinal not in range(128) 

Van wat ik tot nu toe online heb gelezen, komt de fout voort uit het feit dat het XML-bestand in UTF-8 staat, maar Python wil het behandelen als een ASCII-gecodeerd teken. Is er een eenvoudige manier om de fout te laten verdwijnen en mijn programma de XML te laten afdrukken zoals deze wordt gelezen?


Antwoord 1, autoriteit 100%

Waarschijnlijk is je probleem dat je het goed hebt geparseerd, en nu probeer je de inhoud van de XML af te drukken en dat lukt niet omdat er vreemde Unicode-tekens in zitten. Probeer uw Unicode-tekenreeks eerst als ascii te coderen:

unicodeData.encode('ascii', 'ignore')

het gedeelte ‘negeren’ zal het vertellen om die karakters gewoon over te slaan. Uit de Python-documenten:

>>> # Python 2: u = unichr(40960) + u'abcd' + unichr(1972)
>>> u = chr(40960) + u'abcd' + chr(1972)
>>> u.encode('utf-8')
'\xea\x80\x80abcd\xde\xb4'
>>> u.encode('ascii')
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
UnicodeEncodeError: 'ascii' codec can't encode character '\ua000' in position 0: ordinal not in range(128)
>>> u.encode('ascii', 'ignore')
'abcd'
>>> u.encode('ascii', 'replace')
'?abcd?'
>>> u.encode('ascii', 'xmlcharrefreplace')
'&#40960;abcd&#1972;'

Misschien wil je dit artikel lezen: http://www.joelonsoftware.com/articles /Unicode.html, wat ik erg handig vond als een eenvoudige tutorial over wat er aan de hand is. Na het lezen heb je niet meer het gevoel dat je aan het raden bent welke commando’s je moet gebruiken (althans dat is mij overkomen).


Antwoord 2, autoriteit 8%

Een betere oplossing:

if type(value) == str:
    # Ignore errors even if the string is not proper UTF-8 or has
    # broken marker bytes.
    # Python built-in function unicode() can do this.
    value = unicode(value, "utf-8", errors="ignore")
else:
    # Assume the value object has proper __unicode__() method
    value = unicode(value)

Als je meer wilt lezen over waarom:

http://docs.plone.org/manage/troubleshooting/unicode.html#id1


Antwoord 3, autoriteit 4%

De karaktercodering van uw omgeving niet hardcoderen in uw script; print in plaats daarvan Unicode-tekst rechtstreeks:

assert isinstance(text, unicode) # or str on Python 3
print(text)

Als uw uitvoer wordt omgeleid naar een bestand (of een pijp); je zou PYTHONIOENCODINGenvvar kunnen gebruiken om de tekencodering te specificeren:

$ PYTHONIOENCODING=utf-8 python your_script.py >output.utf8

Anders zou python your_script.pymoeten werken zoals het is — je landinstellingen worden gebruikt om de tekst te coderen (controleer POSIX: LC_ALL, LC_CTYPE, LANGenvvars — stel LANGin op een utf-8 locale indien nodig).

Als u Unicode op Windows wilt afdrukken, raadpleegt u dit antwoord dat laat zien hoe u Unicode kunt afdrukken naar de Windows-console, naar een bestand of met IDLE.


Antwoord 4

Uitstekende post: http://www.carlosble.com/ 2010/12/understanding-python-and-unicode/

# -*- coding: utf-8 -*-
def __if_number_get_string(number):
    converted_str = number
    if isinstance(number, int) or \
            isinstance(number, float):
        converted_str = str(number)
    return converted_str
def get_unicode(strOrUnicode, encoding='utf-8'):
    strOrUnicode = __if_number_get_string(strOrUnicode)
    if isinstance(strOrUnicode, unicode):
        return strOrUnicode
    return unicode(strOrUnicode, encoding, errors='ignore')
def get_string(strOrUnicode, encoding='utf-8'):
    strOrUnicode = __if_number_get_string(strOrUnicode)
    if isinstance(strOrUnicode, unicode):
        return strOrUnicode.encode(encoding)
    return strOrUnicode

Antwoord 5

Je kunt iets van het formulier gebruiken

s.decode('utf-8')

die een UTF-8-gecodeerde bytestring omzet in een Python Unicode-tekenreeks. Maar de exacte procedure die moet worden gebruikt, hangt af van hoe u het XML-bestand laadt en ontleden, b.v. als u de XML-tekenreeks nooit rechtstreeks opent, moet u mogelijk een decoderobject uit de gebruiken codecsmodule.


Antwoord 6

Ik heb het volgende geschreven om de hinderlijke niet-ascii-citaten te corrigeren en de conversie naar iets bruikbaars te forceren.

unicodeToAsciiMap = {u'\u2019':"'", u'\u2018':"`", }
def unicodeToAscii(inStr):
    try:
        return str(inStr)
    except:
        pass
    outStr = ""
    for i in inStr:
        try:
            outStr = outStr + str(i)
        except:
            if unicodeToAsciiMap.has_key(i):
                outStr = outStr + unicodeToAsciiMap[i]
            else:
                try:
                    print "unicodeToAscii: add to map:", i, repr(i), "(encoded as _)"
                except:
                    print "unicodeToAscii: unknown code (encoded as _)", repr(i)
                outStr = outStr + "_"
    return outStr

Antwoord 7

Als u een benadering van de tekenreeks op het scherm wilt afdrukken, in plaats van de niet-afdrukbare tekens te negeren, probeer dan het unidecode-pakket hier:

https://pypi.python.org/pypi/Unidecode

De uitleg is hier te vinden:

https://www.tablix.org/~ avian/blog/archives/2009/01/unicode_transliteration_in_python/

Dit is beter dan het gebruik van de u.encode('ascii', 'ignore')voor een gegeven string u, en kan u onnodige hoofdpijn besparen als teken precisie is niet wat u zoekt, maar u wilt toch menselijke leesbaarheid hebben.

Wirawan


Antwoord 8

Probeer de volgende regel bovenaan je python-script toe te voegen.

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

Antwoord 9

Python 3.5, 2018

Als u niet weet wat de codering is, maar de unicode-parser problemen heeft, kunt u het bestand openen in Notepad++en in de bovenste balk Encoding->Convert to ANSI. Dan kun je je python zo schrijven

with open('filepath', 'r', encoding='ANSI') as file:
    for word in file.read().split():
        print(word)

Other episodes