sql >> Databasteknik >  >> RDS >> PostgreSQL

Python + PostgreSQL + konstigt ascii =UTF8-kodningsfel

Frågan börjar med en falsk premiss:

ASCII-tecken finns i intervallet "\x00" till och med "\x7F".

Det tidigare godkända nu raderade svaret fungerade under två grova missuppfattningar (1) att locale ==kodning (2) att latin1-kodningen mappar "\x80" till ett eurotecken.

Faktum är att alla ISO-8859-x-kodningar mappar "\x80" till U+0080, vilket är ett av C1-kontrolltecknen, inte ett eurotecken. Endast 3 av dessa kodningar (x in (7, 15, 16)) ger eurotecknet, som "\xA4". Se denna Wikipedia-artikel .

Du måste veta vilken kodning finns din data i. Vilken maskin skapades den på? Hur? Lokalen den skapades i (inte nödvändigtvis din) kan ge dig en ledtråd.

Observera att "Min data är kodad i latin1" står där uppe med "Checken är på posten" och "Självklart kommer jag att älska dig på morgonen". Dina data är förmodligen kodade i en av cp125x-kodningarna som finns på Windows-plattformar. Observera att alla utom cp1251 (Windows Cyrillic) mappar "\x80" till eurotecknet:

>>> ['\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']

Uppdatera som svar på OP:s kommentar

Det här är lite förvirrande:Först säger du

Men senare säger du

Förklara gärna.

Välja en lämplig cp125x-kodning:Var (geografisk plats) skapades filen? På vilket/vilka språk är texten skriven? Några andra tecken än den förmodade euron med värden> "\x7f"? Om så är fallet, vilka och vilket sammanhang används de i?

Uppdatering 2 Om du inte "vet hur programmet är skrivet" kan varken du eller vi bilda dig en uppfattning om huruvida det alltid använder "\x80" för eurotecknet. Även om det skulle vara monumental enfald att göra något annat, kan det inte uteslutas.

Om texten är skriven på det engelska språket och/eller den är skriven i USA, och/eller den är skriven på en Windows-plattform, så är det rimligt säkert att cp1252 är vägen att gå ... tills du får bevis på motsatsen, i så fall måste du gissa en kodning själv eller svara på (vilket språk, vilken ort) frågorna.




  1. fråga om php summary 01 + 01 =02

  2. Skicka ett schemanamn och tabellnamn dynamiskt i FROM i en urvalsfråga i Postgres

  3. MySQL fulltextsökning på flera tabeller med olika fält

  4. Rails 4 Validerar unika e-postmeddelanden utan case_sensitive