Python-ASCII-en Unicode-decoderen fout

Ik heb dit heel erg frustrerend fout bij het invoegen van een bepaalde string in mijn database. Het zei iets als:

Python kan decoderen byte tekens, verwacht unicode”

Na veel zoeken, zag ik dat ik kon overwinnen van deze fout door het coderen van mijn string in Unicode. Ik probeer dit te doen door het decoderen van de string en vervolgens coderen in UTF-8 formaat. Zoals:

string = string.encode("utf8")

En krijg ik de volgende fout:

'ascii' codec can't decode byte 0xe3 in position 6: ordinal not in range(128)

Ik zijn sterven met deze fout! Hoe kan ik dit oplossen?

  • Er is geen manier waarop we kunnen bieden bijzonderheden als u niet meer weergeven eigenlijke code.
  • toon ons de string (misschien zelfs via repr(string)). Het krijgen van een decodeerfout bij het coderen lijkt het alsof je string is geen unicode. In dit geval IIRC python zal automaticall doen: string.decode(“ascii”).coderen(“utf-8”). Toon ons een voorbeeld snaren en een voorbeeldcode om het probleem te reproduceren.
InformationsquelleAutor Amitash | 2012-07-18



5 Replies
  1. 5

    EDIT: Zoals je kunt zien op de downvotes, dit is NIET DE BESTE MANIER om HET TE DOEN. Een uitstekende, en een zeer aan te bevelen antwoord is onmiddellijk na deze, dus als u op zoek bent naar een goede oplossing is, gebruik dat dan. Dit is een hackish oplossing die niet lief zijn voor u op een later tijdstip.

    Ik voel je pijn, ik heb een heleboel problemen met de dezelfde fout. De eenvoudigste manier heb ik opgelost (en dit is wellicht niet de beste manier, en het hangt af van uw aanvraag) was het om te zetten dingen te unicode, en het negeren van fouten. Hier is een voorbeeld van Unicode-HOWTO – Python v2.7.3 documentatie

    >>> unicode('\x80abc', errors='strict')
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    UnicodeDecodeError: 'ascii' codec can't decode byte 0x80 in position 0:
                        ordinal not in range(128)
    >>> unicode('\x80abc', errors='replace')
    u'\ufffdabc'
    >>> unicode('\x80abc', errors='ignore')
    u'abc'

    Terwijl dit misschien niet de meest doelmatige methode, dit is een methode die het heeft gewerkt voor mij.

    EDIT:

    Een paar mensen in de reacties heb gezegd dat dit een slecht idee, hoewel de vraagsteller aanvaard het antwoord. Het is NIET een geweldig idee, het zal dingen verpesten als u te maken heeft met de europese en tekens met accenten. Echter, dit is iets wat je kunt gebruiken als het NIET het niveau van de productie code, indien het is een persoonlijk project waar je aan werkt, en u hebt een snelle oplossing om dingen op te rollen. Je moet uiteindelijk op te lossen met de juiste methoden, die worden vermeld in de onderstaande antwoorden.

    • Hartelijk dank dat u dit heeft mijn leven gered!
    • Dit zal het gebruik van de standaard codering, ASCII, en gooi alles wat niet kan worden geïnterpreteerd als ASCII. In andere woorden, verliest u al uw geaccentueerd of niet-Europese tekens. Dat lijkt me een heel slecht idee. -1.
    • Dit is waarschijnlijk een slecht idee, als je corrupt uw gegevens door het vernietigen van elke karakter die decode() niet kunnen evenaren in ASCII in de string. Als u het schrijven van deze informatie naar een database, de data-integriteit is waarschijnlijk belangrijk voor u. -1
    • Ik weet dat het een slecht idee, ik zei ‘ het is misschien niet de beste manier.” Er zijn schonere manieren om het te doen, als zijn beantwoord, maar als dit niet met een productie programma, of als het slechts voor een kleine persoonlijke hack om iets werken (dat is wat ik het gebruiken voor), het is een manier om het te doen.
    • je zou op zijn minst gezegd wat er werkelijk gebeurt, zijn de gegevens…
    • Ja, ik zou moeten hebben. Ik bewerkte mijn antwoord om te vermelden is dat nu.
    • Nee, het is niet te gebruiken als het niet het niveau van de productie code. “Negeren” is iets dat je gebruiken wanneer EN ALLEEN WANNEER de invoer van gegevens is gedeeltelijk nietig zijn. Wanneer u een tekst-bestand dat is meestal in UTF8, maar met een maar van Mac gooien, bijvoorbeeld. Deze dingen gebeuren. Dat is wanneer je gebruik negeren.
    • Ik heb net nodig voor een kleine hack genoemd. Dus dat is geen probleem, kan ik dit gebruiken.. ik ben me bewust van de gevolgen.

  2. 49

    U nodig hebt om een gedisciplineerde aanpak. Pragmatische Unicode, of Hoe kan ik Stoppen met De Pijn? heeft alles wat je nodig hebt.

    Als je die fout op die regel van de code, dan is het probleem dat string wordt een byte van de string, en Python 2 is impliciet probeert te decoderen naar Unicode voor u. Maar het is niet zuiver ascii. Je moet weten wat de codering en decodering van het goed.

    • U kan ook nodig zijn dit eerst te lezen: Het Absolute Minimum Elke Software Ontwikkelaar Absoluut Moet Weten Over Unicode-en tekensets joelonsoftware.com/articles/Unicode.html
    • Dat artikel is behoorlijk verouderd. Ik merkte . In UTF-8, elke code punt van 0-127 is opgeslagen in één byte. Alleen code 128 punten en boven zijn opgeslagen met behulp van 2, 3, in feite, maximaal 6 bytes.. Het was beperkt tot 4 bytes 9 jaar geleden. Is er een vergelijkbaar artikel, maar meer up-to-date?
    • dat punt is klein, en zijn er technische redenen waarom “6 bytes” is ook goed. Alles over het artikel goed is.
  3. 12

    De encode methode moet worden gebruikt op unicode objecten om ze te converteren naar een str object met een bepaalde codering. De decode methode moet worden gebruikt op str objecten van een bepaalde codering om te zetten hen unicode objecten.

    Ik veronderstel dat uw database opslaan van tekenreeksen in UTF-8. Dus als je de snaren uit de database, deze om te zetten naar unicode objecten door het doen van str.decode('utf-8'). Dan alleen te gebruiken unicode objecten in uw python programma (literals zijn gedefinieerd met u'unicode string'). En net voor ze op te slaan in de database converteren naar str objecten met uni.encode('utf-8').

  4. 2

    De 0xE3 codepoint is een a met een tilde in Unicode. Uw originele string is waarschijnlijk al in UTF-8, zodat je niet kan decoderen met behulp van de standaard ASCII-tekenset.

  5. 0

    string in python 2.7 is een ecoded string (gecodeerd in de indeling ASCII meestal), maar niet een tekenreeks-of unicode-indeling.

    Dus als je dit doet string.coderen(‘sommige encoding’) je bent eigenlijk het coderen van een gecodeerde string (via een codering)

    Python te decoderen die string met behulp van standaard codering (ASCII-in python 2.7) en dan zal het verder coderen.
    Je tekst is niet gecodeerd in de indeling ASCII, maar een andere codering (UTF8, LATIJNS-1..), dus als python probeert te ontcijferen dit met behulp van ASCII-het genereert een fout, omdat ASCII-codec kan decoderen paar tekens in de string die uit ASCII-bereik (0 – 127)

    #to encode above given string, first decode that using some encoding
    decoded_string = string.decode('utf8')
    #now encode that decoded string
    decoded_string.encode('utf8')

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *