2017-06-19 2 views
0

Ich wähle Werte aus einer MySQL // Maria DB, die Latin1-Zeichensatz mit Latin1_swedish_ci Sortierung enthält. Es gibt mögliche Charaktere aus verschiedenen europäischen Sprachen wie Spanisch, Deutsch oder Norwegisch.Python 3 Zeichencodierungsproblem

bekomme ich die Daten mit

#!/usr/bin/env python3 
# coding: utf-8 

... 
sql.execute("SELECT name FROM myTab") 
for row in sql 
print(row[0]) 

Es gibt eine Fehlermeldung: UnicodeEncodeError: 'ascii' Codec kann nicht codieren Zeichen '\ xf1' Okay, ich habe meinen Druck auf

geändert
print(str(row[0].encode('utf8'))) 

und das Ergebnis sieht wie folgt aus: b '\ xc3 \ xb1' i an diesem Working with utf-8 encoding in Python source aussah, aber ich habe den Header declard. Auch decode('utf8').encode('cp1250') hilft nicht

+0

danke für die Unterstützung. das returnes 'UnicodeDecodeError:' utf-8 'Codec kann Byte 0xf1 in Position 0' nicht decodieren –

+0

Mögliches Duplikat von [Wie sys.stdout Kodierung in Python 3 setzen?] (https://stackoverflow.com/questions/4374455/how-to-set-sys-stdout-encoding-in-python-3) –

Antwort

0

ok das Codierproblem wurde endgültig gelöst. Coldspeed gab eine wichtige Hintern mit dem Höhepunkt. Deshalb alles Lob für ihn! Leider war es nicht so einfach.

Ich habe eine Problemumgehung gefunden, die das Problem beheben.

import sys 
sys.stdout = open(sys.stdout.fileno(), mode='w', encoding='utf8', buffering=1) 

Die Lösung ist von Jack O'Connor. geschrieben in this answer:

1

Python3 versucht, diese Zeichenfolge basierend auf Ihren Gebietsschemaeinstellungen automatisch zu decodieren. Wenn Ihr Gebietsschema nicht mit der Codierung der Zeichenfolge übereinstimmt, erhalten Sie verstümmelten Text oder es funktioniert überhaupt nicht. Sie können es gewaltsam versuchen, es mit Ihrem Gebietsschema zu codieren und dann zu cp1252 zu dekodieren (es scheint, dass dies die Kodierung in der Zeichenkette ist).

print(row[0].encode('latin-1').decode('cp1252')) 
+0

scheint der Punkt mit locale richtet sich an das Ziel. Leider bringt Ihre Vorgehensweise immer noch nicht die richtige Lösung. Aber mit locale komme ich näher. –

+0

@JoePlatano was ist mit 'row [0] .encode ('latin-1') .decodieren ('utf-8')'? –

+0

nein funktioniert nicht, gut es auf Shell tut, wenn ich das Skript als Python script.py es funktioniert. Auf dem Webserver nicht. Ich fügte die folgenden Zeilen 'print (sys.stdout.encoding)' und 'print (sys.getdefaultencoding())' in der Shell hinzu, es gibt utf-8 für beide. Wenn ich das Skript im Browser ausführe, gibt es ANSI_X3.4-1968 für sys.stdout.encoding und utf-8 für sys.getdefaultencoding(). Ich denke, es gibt einige Gebietsfehler auf Apache –