Frage

Ich habe diese:

>>> print 'example'
example
>>> print 'exámple'
exámple
>>> print 'exámple'.upper()
EXáMPLE

Was ich brauche, um Druck zu tun:

EXÁMPLE

(Wobei das 'a' hat seinen accute Akzent, aber in Großbuchstaben).

Ich bin mit Python 2.6.

War es hilfreich?

Lösung

Ich denke, es ist so einfach wie nicht Umwandlung zuerst in ASCII.

 >>> print u'exámple'.upper()
 EXÁMPLE

Andere Tipps

In Python 2.x konvertiert nur die Zeichenfolge vor dem Aufruf von oben nach Unicode (). Verwenden Sie den Code, der in utf-8-Format auf dieser Webseite ist:

>>> s = 'exámple'
>>> s
'ex\xc3\xa1mple'  # my terminal is not utf8. c3a1 is the UTF-8 hex for á
>>> s.decode('utf-8').upper()
u'EX\xc1MPLE'  # c1 is the utf-16 aka unicode for á

Der Aufruf von decode es von seinem aktuellen Format auf Unicode nimmt. Sie können es dann in ein anderes Format, wie utf-8, unter Verwendung kodieren konvertieren. Wenn das Zeichen in ist, sagen, iso-8859-2 (Czech, etc, in diesem Fall), würden Sie stattdessen s.decode('iso-8859-2').upper() verwenden.

Wie in meinem Fall, wenn Ihr Terminal ist nicht Unicode / UTF-8 kompatibel ist, das Beste, was Sie für hoffen können, ist entweder eine hexadezimale Darstellung der Charaktere (wie bei mir) oder es zu konvertieren lossily s.decode('utf-8').upper().encode('ascii', 'replace') verwenden, was dazu führt ' EX? mple‘. Wenn Sie nicht Ihre Terminal Show Unicode machen können, schreiben Sie die Ausgabe in eine Datei in utf-8-Format und öffnen Sie, dass in Ihrem bevorzugten Editor.

Zunächst einmal, ich nur Python 3.1 in diesen Tagen verwenden; sein zentraler Verdienst ist disambiguierter Byte-Zeichenfolge von Unicode-Objekten zu haben. dies macht die überwiegende Mehrheit der Text Manipulationen viel sicherer als der Fall verwendet werden. in den Billionen von Benutzerfragen in Bezug auf Python 2.x Codierung Probleme mit einem Gewicht, das u'äbc Konvention von Python 2.1 war nur ein Fehler; mit ausdrücklichen bytes und bytearray, wird das Leben so viel einfacher.

zweitens, wenn py3k nicht Ihr Geschmack ist, dann versuchen Sie mit from __future__ import unicode_literals zu gehen, da dies py3k Verhalten auf Python 2.6 und 2.7 imitieren. hätte diese Sache die (leicht gebunden) pfuschen vermieden du hast, wenn print 'exámple'.upper() sagen. Im Wesentlichen ist dies das gleiche wie in py3k: print( 'exámple'.encode( 'utf-8' ).upper() ). vergleichen diese Versionen (für py3k):

print( 'exámple'.encode( 'utf-8' ).upper() )
print( 'exámple'.encode( 'utf-8' ).upper().decode( 'utf-8' ) )
print( 'exámple'.upper() )

Die erste ist, im Grunde, was Sie wann hat eine blanke Saite 'exámple' verwendet, sofern Sie Ihre Standard-Kodierung eingestellt (entsprechend einer BDFL Verlautbarung utf-8, die Standard-Kodierung zur Laufzeiteinstellung ist eine schlechte Idee, so in py2 Sie werden es import sys; reload( sys ); sys.setdefaultencoding( 'utf-8' ) sagen Trick haben; i eine bessere Lösung für py3k präsentieren unten). wenn Sie die Ausgabe dieser drei Zeilen sehen:

b'EX\xc3\xa1MPLE'
EXáMPLE
EXÁMPLE

Sie können sehen, dass, wenn upper() auf den ersten Text angewendet wurde, es auf Bytes gehandelt hat, nicht auf Zeichen. Python ermöglicht die upper() Methode auf Bytes, aber es ist nur auf der US-ASCII-Interpretation von Bytes definiert. da utf-8 verwendet Werte in 8 Bit, aber außerhalb von US-ASCII (128 bis 255, die nicht von US-ASCII verwendet werden), werden diejenigen nicht betroffen von upper(), so dass, wenn wir in der zweiten Zeile dekodieren zurück, bekommen wir, dass Klein á. Schließlich hat die dritte Zeile es richtig, und ja, Überraschung, scheint Python bewusst zu sein, dass Á ist der Großbuchstabe á entspricht. ich lief einen schnellen Test, um zu sehen, welche Zeichen Python 3 nicht zwischen Groß- und Kleinschreibung konvertiert:

for cid in range( 3000 ):
  my_chr = chr( cid )
  if my_chr == my_chr.upper() and my_chr == my_chr.lower():
    say( my_chr )

die Liste durchlesen zeigt sehr wenige Fälle von lateinischen, kyrillischen oder griechischen Buchstaben; die meisten der Ausgang ist nicht-europäische Zeichen und Interpunktion. die einzigen Zeichen i, den Python finden konnte und es ist falsch Ԥ / ԥ (\ u0524 \ u0525 ‚kyrillisch {Kapital | small} Brief pe mit Abseilgerät‘), so lange, wie Sie Extended-X Blöcke außerhalb der lateinischen bleiben ( diejenigen, Check-out, sie könnten Überraschungen ergeben), könnte man tatsächlich diese Methode verwenden. natürlich, ich habe nicht die Richtigkeit der Zuordnungen überprüfen.

schließlich, hier ist das, was ich in meinen py3k Anwendung Boot Abschnitt setzen: ein Verfahren, das die Codierung sys.stdout sieht, mit numerischen Zeichenreferenzen (NCRs) als Rückfall neu definiert; Dies hat den Effekt, dass auf der Standardausgabe Druck wird nie einen Unicode-Codierung Fehler auslösen. wenn ich auf Ubuntu arbeiten, _sys.stdout.encoding ist utf-8; wenn das gleiche Programm auf Windows läuft, könnte es etwas kurios wie cp850 sein. der Ausgang Macht sieht starnge, aber die Anwendung läuft ohne eine Ausnahme auf diesem dämlichen Terminals zu erhöhen.

#===========================================================================================================
# MAKE STDOUT BEHAVE IN A FAILSAFE MANNER
#-----------------------------------------------------------------------------------------------------------
def _harden_stdout():
  """Ensure that unprintable output to STDOUT does not cause encoding errors; use XML character references
  so any kind of output gets a chance to render in a decipherable way."""
  global _sys_TRM
  _sys.stdout       = _sys_TRM = _sys_io.TextIOWrapper(
    _sys.stdout.buffer,
    encoding        = _sys.stdout.encoding,
    errors          = 'xmlcharrefreplace',
    line_buffering  = true )
#...........................................................................................................
_harden_stdout()

ein weiteres Stück der Beratung: bei der Prüfung, immer versuchen, oder eine ähnliche Sache zu print repr( x ), die die Identität von x enthüllt. alle Arten von Missverständnissen auftauchen können, wenn Sie nur in py2 print x und x ist entweder ein Oktett String oder ein Unicode-Objekt. es ist sehr rätselhaft und anfällig viel Kopf-Kratzen zu verursachen. wie ich schon sagte, versuchen, zumindest zu bewegen mit dem aus der Zukunft Import Unicode-Literale Beschwörung py26.

und zu schließen, zitiert ein Zitat: "Glyph Lefkowitz sagt es am besten in seinem Artikel Encoding :

  

Ich glaube, dass im Rahmen dieser   Diskussion, der Begriff „string“ ist   bedeutungslos. Es gibt Text, und es   ist BYTE orientierte Daten (welche sehr   gut vertreten Text, ist aber noch nicht   umgerechnet auf sie). In Python-Typen,   Dieser Text ist Unicode. Daten str. Die Idee   von „non-Unicode-Text“ ist nur ein   Programmierfehler auf uns zukommen. "

Update: gerade gefunden Python 3 richtig konvertiert s Kleinen lateinischen Buchstaben LONG S bis S, wenn großgeschrieben. ordentlich!

Ich denke, es ist ein bisschen Hintergrund hier wir fehlen:

>>> type('hello')
<type 'str'>

>>> type(u'hello')
<type 'unicode'>

Solange Sie verwenden „Unicode“ Strings anstelle von „native“ Strings, werden die Operatoren wie oben () mit Unicode daran arbeiten. FWIW, Python 3 verwendet Unicode standardmäßig, so dass die Unterscheidung weitgehend irrelevant.

eine Zeichenfolge aus unicode Taking zu str und dann zurück zu unicode ist suboptimal in vielerlei Hinsicht, und viele Bibliotheken werden Unicode-Ausgabe erzeugen, wenn Sie es wünschen; so versuchen nur unicode Objekte für Strings verwenden intern, wann immer Sie können.

Versuchen Sie es:

s = 'exámple'
print unicode(s).upper()
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top