2009-07-12 7 views
19

Wird es bei der Codierung in Python als bewährte Methode angesehen, Unicode-Zeichenfolgen über regulären Zeichenfolgen auszuwählen? Ich arbeite hauptsächlich auf der Windows-Plattform, wo die meisten String-Typen heutzutage Unicode sind (d. H. .NET String, '_UNICODE' wird standardmäßig in einem neuen C++ - Projekt usw. aktiviert). Daher neige ich zu der Annahme, dass der Fall, in dem Nicht-Unicode-String-Objekte verwendet werden, eine Art seltener Fall ist. Wie auch immer, ich bin neugierig darauf, was Python-Praktiker in realen Projekten machen.Sollte ich Unicode-String standardmäßig verwenden?

Antwort

17

Von meiner Praxis - verwenden Sie Unicode.

Zu Beginn eines Projekts verwendeten wir gewöhnliche Zeichenketten, aber unser Projekt wuchs, wir implementierten neue Funktionen und setzten neue Bibliotheken von Drittanbietern ein. In diesem Chaos mit Nicht-Unicode/Unicode-String begannen einige Funktionen zu versagen. Wir begannen Zeit damit zu verbringen, diese Probleme zu lokalisieren und zu beheben. Einige Module von Drittanbietern werden jedoch nicht Unicode unterstützt und fingen an zu scheitern, nachdem wir zu ihr gewechselt haben (aber das ist eher ein Ausschluss als eine Regel).

Auch ich habe einige Erfahrung, wenn wir einige Module von Drittanbietern (z. B. SendKeys) neu schreiben mussten, weil sie Unicode nicht unterstützten. Wenn es in Unicode von Anfang an gemacht wurde, wird es besser :)

Also ich denke, heute sollten wir Unicode verwenden.

P.S. Das ganze Unordnung nach oben ist nur meine Meinung hamble :)

+2

+1: Verwenden Sie immer Unicode, wenn Sie Text bearbeiten. Wann immer es erforderlich ist, die Textdaten als Bytes zu behandeln (z. B. beim Verschieben über das Netzwerk oder Schreiben auf Datenträger) - Konvertieren Sie den Unicode in eine Bytefolge (in Python als Zeichenfolge dargestellt). Konvertieren durch Aufruf von encode oder unicode. – codeape

2

Wenn Sie mit stark eingeschränktem Speicher oder Speicherplatz arbeiten, verwenden Sie ASCII-Zeichenfolgen. In diesem Fall sollten Sie Ihre Software in C oder etwas noch kompakter schreiben :)

13

Wie Sie diese Frage stellen, nehme ich an, dass Sie Python 2.x verwenden.

Python 3.0 hat sich in der Zeichenfolgendarstellung ziemlich geändert, und der gesamte Text ist jetzt Unicode.
Ich würde für Unicode in jedem neuen Projekt gehen - in einer Weise kompatibel mit der Umstellung auf Python 3.0 (siehe details).

+0

Yeah, zukünftige Kompatibilität ist ziemlich wichtig! –

4

Zusätzlich zu Mihails Kommentar würde ich sagen: Verwenden Sie Unicode, da es die Zukunft ist. In Python 3.0 wird Non-Unicode weg sein, und soviel ich weiß, werden alle "U" -Prefixes Schwierigkeiten machen, da sie auch weg sind.

5

Es kann schwierig sein, konsequent Unicode-Strings in Python 2.x zu verwenden - sei es, weil jemand versehentlich die natürlichere str(blah) verwendet, wo sie unicode(blah) gemeint, auf Stringliterale das u Präfix zu vergessen, Modul Inkompatibilitäten Fremd - was auch immer. Verwenden Sie also in Python 2.x nur Unicode, wenn Sie müssen, und Sie sind bereit, eine gute Unit-Testabdeckung bereitzustellen.

Wenn Sie jedoch die Möglichkeit haben, Python 3.x zu verwenden, müssen Sie sich nicht darum kümmern - Zeichenfolgen werden Unicode ohne zusätzlichen Aufwand.

13

Ja, verwenden Sie Unicode.

Einige Hinweise:

  1. Wenn in jeder Art von Binärformat Input-Output zu tun, dekodieren direkt nach dem Lesen und Codieren direkt vor dem Schreiben, so dass Sie nie Strings und Unicode mischen müssen. Weil das Mischen früher oder später zu UnicodeEncodeDecodeErrors führt.

  2. [Vergessen Sie diesen, meine Erklärungen haben es noch verwirrender gemacht. Es ist nur ein Problem bei der Portierung auf Python 3, Sie können sich dann darum kümmern.]

  3. Häufige Python-Newbie-Fehler mit Unicode (nicht sagen, Sie sind ein Neuling, aber das kann von Neulingen gelesen werden): Verwechseln Sie nicht verschlüsseln und dekodieren. Denken Sie daran, dass UTF-8 eine EN-Codierung ist, also codieren Sie Unicode als UTF-8 und DEcode.

  4. Verfallen Sie nicht der Versuchung, die Standardcodierung in Python (von setdefaultencoding in sitecustomize.py oder ähnlichem) auf das zu setzen, was Sie am häufigsten verwenden. Das wird Ihnen nur Probleme bereiten, wenn Sie neu installieren oder auf einen anderen Computer wechseln oder plötzlich eine andere Kodierung verwenden müssen. Sei explizit.

  5. Denken Sie daran, nicht alle von Python 2s Standard-Bibliothek akzeptiert Unicode. Wenn Sie eine Methode Unicode füttern und es nicht funktioniert, aber es sollte, versuchen Sie es füttern ascii und sehen. Beispiele: urllib.urlopen(), das mit nicht hilfreichen Fehlern fehlschlägt, wenn Sie ihm ein Unicode-Objekt anstelle einer Zeichenfolge geben.

Hm. Das ist alles, woran ich jetzt denken kann!

+0

Punkt 3 ist so wahr - alle die ich kenne (einschließlich mir) haben diesen Fehler gemacht, und nicht nur einmal! –

+1

Re: "Kodieren direkt nach dem Schreiben" - können Sie klären? Ich denke, das sollte "vorher" anstatt "nachher" sein, aber ich könnte Ihren Standpunkt vermissen. – ars

+0

@Lennart: "Beachten Sie, dass, auch wenn Sie nach Unicode in eine Zeichenfolge mit nicht-ASCII-Text zu kodieren, dies nach Python immer noch Text ist." ... In 3.x gibt str.encode() den Typ Byte zurück, und die Unterscheidung nach ASCII oder nicht scheint irrelevant zu sein; Was ist der Punkt, den du versuchst zu machen? –

Verwandte Themen