Domanda

ho questo:

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

Che cosa devo fare per la stampa:

EXÁMPLE

(dove il 'a' prende il suo accento accute, ma in lettere maiuscole.)

Sto usando Python 2.6.

È stato utile?

Soluzione

Credo che sia così semplice come non la conversione in ASCII prima.

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

Altri suggerimenti

In Python 2.x, basta convertire la stringa in Unicode prima di chiamare superiore (). Utilizzando il codice, che è in formato UTF-8 su questo Web:

>>> 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 á

La chiamata a decode prende dal suo formato attuale in Unicode. È quindi possibile convertirlo in un altro formato, come UTF-8, utilizzando la codifica. Se il personaggio è stato, per esempio, iso-8859-2 (Repubblica, ecc, in questo caso), si dovrebbe invece usare s.decode('iso-8859-2').upper().

Come nel mio caso, se il terminale non è unicode / UTF-8 compatibile, il meglio che puoi sperare è sia una rappresentazione esadecimale dei personaggi (come il mio) o convertirlo lossily usando s.decode('utf-8').upper().encode('ascii', 'replace'), che si traduce in ' EX? Mple'. Se non si può fare il vostro terminale spettacolo unicode, scrivere l'output in un file in formato UTF-8 e aprire che nel vostro editor preferito.

Prima di tutto, io uso solo python 3.1 in questi giorni; il suo merito centrale è quella di avere le stringhe di byte disambiguare da oggetti Unicode. questo rende la stragrande maggioranza delle manipolazioni di testo molto più sicuro di quanto usato per essere il caso. pesatura nei bilioni di domande dell'utente per quanto riguarda problemi di codifica pitone 2.x, la convenzione u'äbc pitone 2.1 era solo un errore; con bytes esplicito e bytearray, la vita diventa molto più facile.

In secondo luogo, se py3k non è il tuo sapore, quindi provare ad andare con from __future__ import unicode_literals, in modo da simulare il comportamento di py3k su Python 2.6 e 2.7. questa cosa avrebbe potuto evitare la (facilmente impegnati) sproposito hai fatto quando dice print 'exámple'.upper(). in sostanza, questo è lo stesso come in py3k: print( 'exámple'.encode( 'utf-8' ).upper() ). confrontare queste versioni (per py3k):

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

Il primo è, in fondo, quello che hai fatto quando ha utilizzato un nudo 'exámple' stringa, a condizione che si imposta la codifica predefinita per utf-8 (secondo un pronunciamento BDFL, impostare la codifica predefinita in fase di esecuzione è una cattiva idea, quindi in PY2 dovrete ingannarlo dicendo import sys; reload( sys ); sys.setdefaultencoding( 'utf-8' ), vi presento una soluzione migliore per py3k sotto). quando si guarda l'output di queste tre linee:

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

si può vedere che quando upper() ottenuto applicato al primo testo, ha agito in byte, non su caratteri. python permette il metodo upper() in byte, ma si è definito solo sull'interpretazione US-ASCII di byte. poiché utf-8 utilizza valori all'interno 8 bit, ma fuori di US-ASCII (128 fino a 255, che non vengono utilizzati da US-ASCII), quelli non saranno colpiti da upper(), così quando siamo decodificare di nuovo nella seconda riga, otteniamo che minuscole á. Infine, la terza linea fa proprio, e sì, a sorpresa, pitone sembra essere consapevole del fatto che Á è la lettera maiuscola corrispondente a á. ho eseguito un test rapido per vedere quali caratteri Python 3 non consente di convertire tra lettere maiuscole e minuscole:

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

sfogliando l'elenco rivela pochissimi episodi di lettere latine, cirillici o greci; la maggior parte della produzione è caratteri non europei e la punteggiatura. gli unici personaggi che ho trovato che Python ricevuti sbagliato sono Ԥ / ԥ (\ u0524, \ u0525, 'cirillico {capitale | piccoli} pe lettera con discensore'), così finché si rimane al di fuori dei blocchi Esteso-X latini ( controllare quelli, potrebbero cedere sorprese), si potrebbe effettivamente utilizzare tale metodo. Naturalmente, non ho controllato la correttezza delle mappature.

, infine, ecco quello che ho messo nel mio py3k sezione di avvio dell'applicazione: un metodo che ridefinisce il sys.stdout codifica vede, con riferimenti a caratteri numerici (NCR) come ripiego; questo ha l'effetto che la stampa sullo standard output non potrà mai sollevare un errore di codifica Unicode. Quando lavoro su Ubuntu, _sys.stdout.encoding è utf-8; quando lo stesso programma viene eseguito su Windows, potrebbe essere qualcosa di caratteristico come cp850. la potenza di uscita sembra starnge, ma l'applicazione viene eseguita senza sollevare un'eccezione su quei terminali ottuso.

#===========================================================================================================
# 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()

un altro pezzo di consiglio: durante il test, cerca sempre di print repr( x ) o una cosa simile che rivela l'identità di x. tutti i tipi di incomprensioni possono sorgere solo se si print x in PY2 e x è o una stringa di ottetto o di un oggetto Unicode. è molto sconcertante e incline a causare un sacco di testa-graffio. come ho detto, provare a spostare almeno py26 con quello di future importazioni unicode letterali incantesimo.

e di chiudere, citando una citazione: "Glifo Lefkowitz afferma che la cosa migliore nel suo articolo codifica :

  

Credo che nel contesto di questa   discussione, il termine "stringa" è   privo di significato. C'è del testo, e ci   è Bdati YTE orientato (che molto may   ben rappresentare il testo, ma non è ancora   convertito ad esso). Nei tipi Python,   Il testo è unicode. Dati è str. L'idea   di "testo non Unicode" è solo un   errore di programmazione in attesa di accadere ".

aggiornamento: appena trovato pitone 3 converte correttamente s minuscola latina S LONG S quando il maiuscolo. pulito!

Credo che ci sia un po 'di background ci manca qui:

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

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

Fino a quando si sta utilizzando "Unicode" stringhe invece di stringhe "nativi", gli operatori come superiore () opereranno con unicode in mente. FWIW, Python 3 utilizza unicode per default, rendendo la distinzione in gran parte irrilevante.

Facendo una stringa dal unicode a str e poi di nuovo a unicode è ottimale in molti modi, e molte biblioteche produrrà uscita unicode se lo vuoi; quindi cercate di usare solo gli oggetti unicode per le stringhe internamente ogni volta che potete.

Da provare:

s = 'exámple'
print unicode(s).upper()
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top