Frage

In Python kann Strings Unicode sein (beide utf-16 und utf-8) und Single-Byte mit verschiedenen Codierungen (CP1251, cp1252 usw.). Ist es möglich, zu überprüfen, was Codierung String? Zum Beispiel:

time.strftime( "%b" )

wird eine Zeichenfolge mit dem Text Namen eines Monats zurück. Unter MacOS String zurückgegeben utf-16 sein wird, unter Windows mit englischen lokalen wird es einzelne Byte mit ASCII-Codierung sein und unter Windows mit nicht-englischem Gebietsschema wird es über Gebietsschema des Codepage kodiert werden, zB CP1251. Wie kann ich solche Strings umgehen?

War es hilfreich?

Lösung

Strings speichern keine Codierung Informationen, Sie müssen nur eine angeben, wenn Sie nach / von Unicode oder drucken zu einem Ausgabegerät zu konvertieren:

import locale
lang, encoding = locale.getdefaultlocale()
mystring = u"blabla"
print mystring.encode(encoding)

UTF-8 ist nicht Unicode, es ist eine Kodierung von Unicode in einzelne Byte-Strings.

Die beste Vorgehensweise ist mit Unicode überall auf der Python-Seite zu arbeiten, speichern Sie Ihre Strings mit einer Unicode-reversible Codierung wie UTF-8, und wandeln sie einzubilden Gegenden nur für Benutzer ausgegeben.

Andere Tipps

charset-Erkennung ist sehr komplex.

aber was ist Ihr eigentlicher Zweck dafür? wenn Sie nur Wert wollen in Unicode sein, schreiben Sie einfach

unicode(time.strftime("%b"))

, und es sollte für alle Fälle arbeiten Sie bereits erwähnt haben:

  • Mac OS: Unicode (Unicode) -> Unicode
  • win / ger: Unicode (ascii) -> Unicode
  • win / noneng: Unicode (some_cp) -> wird von den lokalen cp umgewandelt werden -> Unicode

Wenn Sie eine ziemlich lange Zeichenkette in einer unbekannten Codierung haben, können Sie versuchen, die Codierung zu erraten, z.B. Encoding-Detektor mit der Allgemeinen unter https://github.com/dcramer/chardet - nicht narrensicher von natürlich, aber manchmal errät es richtig ;-). Aber das wird nicht viel helfen, mit sehr kurzen Saiten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top