5

Ich habe gerade einige Unicode-Fehler mit einer Anwendung, die ich gerade ausgeführt habe, die immer mit wirklich seltsamen Strings, zuletzt,Python Unicode-Fehler, synchronisieren die Entwicklungsumgebung und Produktion

Pınar Karsıyaka 

in meiner dev-Umgebung (Aptana w. PyDev auf Mavericks Mac mit einer aktuellen Homebrew python installieren), mit dieser Zeichenfolge handelt erzeugt keinen Fehler und ist als

P\u0131nar Kars\u0131yaka v Torku Selcuk 
auf die Konsole gedruckt

aber auf der Produktionsumgebung, Standard-Ubuntu und Python auf einem Amazo installieren n EC2 kleine Box wird diese gedruckt wie

P\xc4\xb1nar Kars\xc4\xb1yaka v Torku Selcuk 

und gibt eine der gefürchteten Python Fehler,

UnicodeEncodeError: 'ascii' codec can't encode character u'\u0131' in position 50: ordinal not in range(128) 

Ich würde gerne wissen, wie (wenn möglich) die prod Umgebung ermöglichen zu können, mit diesen Charakteren umzugehen, wie meine Entwicklungsumgebung, aber ich würde auch gerne meine Entwicklungsumgebung so verändern können, dass sie wie der erste bricht, so dass ich mit den Vorkommnissen umgehen kann, wo dies im Code passiert.

Danke für jede Hilfe in Bezug auf diese.

Mac Python - Python 2.7.5 (Standard, 1. November 2013, 18.38.34) [GCC 4.2.1 kompatibel Apple LLVM 5.0 (Klirren-500.2.79)] auf Darwin

Ubuntu Python - Python 2.7.3 (Standard, 10. April 2013, 06.20.15) [GCC 4.6.3] auf linux2

+0

Python 2 oder Python 3? – metatoaster

+0

Wahrscheinlich ist die Shell-Codierung auf dem Server nicht UTF-8, aber Ihre ist zu Hause. Vergleichen Sie den Wert von zum Beispiel "echo $ LC_ALL" auf jedem. –

+0

Python 2.7 auf jedem, fügte die vollständigen Details der Frage hinzu. @ Two-BitAlchemist, der auf beiden Rechnern für mich leer/leer erscheint. – seaders

Antwort

3

Wenn Sie ein wenig in der 2,7 Zweig der Python Quellen tauchen, werden Sie feststellen, aus, dass die default encoding of unicode strings ist erstens set to some forced value (jetzt ist es "ascii", obwohl es "UTF-8" vor dann gewesen ist), aber es ist overridden by the site module während jeder Instantiierung des Interpreters.

das Verhalten auf jeder Plattform zu überprüfen, laufen:

$ python -c 'import sys; print(sys.getdefaultencoding())' 

Nun, wenn man sie selbst machen wollen, ist es nicht ganz einfach ist, da die Funktion ‚setDefaultEncoding‘ deleted in the site module ist, so dass Sie müssen das sys-Modul neu zu laden, es zu bekommen:

$ python -c 'import sys; reload(sys); sys.setdefaultencoding("utf-8"); print(sys.getdefaultencoding())' 

auf diese Weise Sie die gleiche Codierung, in Ihrem Dolmetscher, auf jeder Plattform rega haben Rdless der Locales und Codierung auf mehreren Ebenen von der os auf die Python-Build definiert.

1

Bibliothek Versionen

Bitte überprüfen, ob die alle Bibliotheksversionen die gleichen sind, vermute ich, dass eine API-Änderung gibt es, die unicode vs str aus einer externen Datenquelle zurückgibt. Ich habe diese Probleme bereits beim Upgrade von SQLObject und Cherrypy gesehen. Auch Datenquelleneinstellungen sind wichtig. Wenn Sie beispielsweise einen mysql Server verwenden, müssen Sie auf default_encoding achten.

Ihre Fragen gibt keine Datenquelle, es ist schwer zu erraten.

Zumindest pip freeze in beiden Environments und vergleichen Sie die Versionsnummern.

Standardkodierung

Überprüfen Sie, ob sitecustomize.py in einer der Umgebungen ist - das ist der offizielle Weg, um alle wackelig Dinge einzurichten (die man sowieso nicht sollte, aber das ist eine andere Geschichte).

Es macht wahrscheinlich genau das, was @ chocko01 vorschlägt - setzt die Standardcodierung. Überprüfen Sie es, indem Sie in beiden Umgebungen sys.getdefaultencoding() protokollieren.

Einstellung der Standardcodierung in Python macht die Konvertierung (Python2) und str<->bytes (Python3) transparent, aber auf lange Sicht ist es eine schlechte Idee. Denken Sie daran, dass explicit is better than implicit.

Ihre Daten Trace

Es ist ein harter CCC zu knacken, aber wenn man dieses besondere Problem in einer reproduzierbaren Test erfassen kann, die 2. beste ist Tonnen von Protokollen zu entleeren und dann arbeiten Sie sich nach hinten und sehen Woher kommt dein funky Input?

Dann verfolgen Sie es nach unten, um festzustellen, wo der Unterschied zwischen Ihrer lokalen und Produktionsumgebung ist.

Zum Zeitpunkt des Fehlers ist es unicode in Ihrem lokalen env und UTF-8 codiert, auch bekannt als str in der Produktion env. Die Tatsache, dass Sie eine Stichprobe für beide Umgebungen haben, legt nahe, dass Sie das Problem reproduzieren können. Vielleicht sollten Sie auch einen automatisierten Test schreiben.

+0

Dies ist keine Antwort und sollte stattdessen ein Kommentar zu https://stackoverflow.com/a/23319208/247648 – Giel

+0

erweitert werden; btw @Giel, wenn wir pedantisch sein wollen, verweist dein Link auf meine Antwort und nicht auf die Frage. –

+1

nein es zeigt auf choko01's Antwort, und ich sehe, dass Sie Ihre Antwort komplett umgeschrieben haben, also werde ich diese – Giel