sql >> Database >  >> RDS >> PostgreSQL

Python + PostgreSQL + vreemde ascii =UTF8-coderingsfout

De vraag begint met een valse premisse:

ASCII-tekens liggen in het bereik "\x00" tot en met "\x7F".

Het eerder geaccepteerde nu verwijderde antwoord werkte op basis van twee grove misvattingen (1) die locale ==-codering (2) die de latin1-codering "\x80" toewijst aan een Euro-teken.

In feite verwijzen alle ISO-8859-x-coderingen "\x80" naar U+0080, wat een van de C1-controletekens is, geen Euro-teken. Slechts 3 van die coderingen (x in (7, 15, 16)) leveren het Euro-teken, als "\xA4". Zie dit Wikipedia-artikel .

Je moet weten in welke codering uw gegevens zich bevinden. Op welke machine is het gemaakt? Hoe? De landinstelling waarin het is gemaakt (niet noodzakelijk de jouwe) kan je een idee geven.

Merk op dat "Mijn gegevens zijn gecodeerd in latin1" daarboven staat met "De cheque is op de post" en "Natuurlijk zal ik morgen van je houden". Uw gegevens zijn waarschijnlijk gecodeerd in een van de cp125x-coderingen die te vinden zijn op Windows-platforms. Merk op dat ze allemaal behalve cp1251 (Windows Cyrillisch) "\x80" toewijzen aan het euro-teken:

>>> ['\x80'.decode('cp125' + str(x), 'replace') for x in range(9)]
[u'\u20ac', u'\u0402', u'\u20ac', u'\u20ac', u'\u20ac', u'\u20ac', u'\u20ac', u'\u20ac', u'\u20ac']

Bijwerken als reactie op de opmerking van de OP

Dit is een beetje verwarrend:eerst zeg je

Maar later zeg je

Leg uit.

Een geschikte cp125x-codering selecteren:Waar (geografische locatie) is het bestand gemaakt? In welke taal/talen is de tekst geschreven? Andere tekens dan de vermoedelijke euro met waarden> "\x7f"? Zo ja, welke en in welke context worden ze gebruikt?

Update 2 Als u niet "weet hoe het programma is geschreven", kunnen u noch wij een mening vormen of het altijd "\x80" voor het euroteken gebruikt. Hoewel anders doen monumentale dwaasheid zou zijn, kan het niet worden uitgesloten.

Als de tekst in de Engelse taal is geschreven en/of in de VS is geschreven, en/of op een Windows-platform is geschreven, dan is het redelijk zeker dat cp1252 is de juiste keuze ... totdat u het tegendeel bewijst, in welk geval u zelf een codering moet raden of de vragen (welke taal, welke plaats) moet beantwoorden.




  1. Wat is STATISTIEKEN TIJD in SQL Server?

  2. Selecteer ALLE velden die alleen HOOFDLETTERS bevatten

  3. waarom werkt de opgeslagen procedure die wordt aangeroepen vanuit sqlalchemy niet, maar werkt het aanroepen vanuit de workbench wel?

  4. Django, toegang tot de PostgreSQL-reeks