2010-03-17 10 views
133

Come in:Qual è il prefisso u in una stringa Python?

u'Hello' 

La mia ipotesi è che si indica "Unicode", è corretto?

Se sì, da quando è disponibile?

+33

@ S. Lott, Beh, non è sempre facile da individuare il riferimento nella pagina e riga esatta, specialmente quando sei nuovo in una certa lingua. Trovo più facile e veloce chiedere qui. (Vedi: http://meta.stackexchange.com/questions/16353/stackoverflow-for-the-lazy-newbie-developer) Btw, è incredibile quanto velocemente google indicizzato questo thread, ora è il terzo risultato: http: //www.google.com/search?q=u+prefix+on+python – OscarRyz

+1

@Oscar Reyes: Mi dispiace, ma il riferimento alla lingua * deve * essere il tuo primo, ultimo e unico resort per questo genere di cose. Altrimenti, rimarrai bloccato in modalità n00b perpetua. È molto importante avere una solida presa sul manuale di riferimento linguistico per superare le domande su n00b e iniziare a risolvere problemi reali per le persone. –

+1

@ S.Lott: hai ragione. E ** ora ** so dove è il riferimento alla lingua :) – OscarRyz

risposta

35

La mia ipotesi è che indica "Unicode", è corretto?

Sì.

Se sì, da quando è disponibile?

Python 2.x.

(In Python 3.x le stringhe Unicode utilizzare per impostazione predefinita e non c'è bisogno per il prefisso u.)

+3

+1 Per la nota 3.x grazie – OscarRyz

+4

È anche un Errore di sintassi in Python 3 per usare il prefisso 'u'. –

+11

@TimPietzcker: solo in 3.0-3.2; in 3.3+ è legale (e privo di significato), per semplificare la scrittura di librerie e app 2.6 +/3.3 + single-codebase. – abarnert

1

Tutte le stringhe destinate agli esseri umani dovrebbero usare u" ".

Ho trovato che la seguente mentalità aiuta molto quando si tratta di stringhe Python: Tutti Python le stringhe manifeste dovrebbero usare la sintassi u"". La sintassi "" è solo per gli array di byte.

Prima che inizi il colpo, lasciatemi spiegare. Molti programmi Python iniziano con l'uso di "" per le stringhe. Ma poi hanno bisogno di supportare la documentazione da Internet, quindi iniziano a usare "".decode e all'improvviso ottengono eccezioni ovunque sulla decodifica di questo e quello - tutto a causa dell'uso di "" per le stringhe. In questo caso, Unicode si comporta come un virus e provocherà il caos.

Ma, se segui la mia regola, non avrai questa infezione (perché sarai già infetto).

+0

'bash -c" echo Non dovresti usare b \\\ "... \\\" per gli array di byte? "' – kennytm

+0

@KennyTM Sembra buono! Volevo dire semplicemente che tutte le stringhe destinate agli umani dovrebbero usare "u" "". –

+0

Se si desidera utilizzare religiosamente Unicode ovunque, che, per molte applicazioni (ma non tutte), è una buona cosa, quasi certamente si desidera Python 3.x, non 2.x. Questo potrebbe non essere stato vero nel 2010, quando è stato scritto, ma nel 2014, la maggior parte delle librerie o piattaforme che impediscono l'aggiornamento a 3.x ti impediranno anche di usare Unicode correttamente ... – abarnert

91

La voce u'Some String' indica che la stringa è una stringa Unicode.

D: Sono in una terribile, terribile fretta e sono atterrato qui da Ricerca Google. Sto cercando di scrivere questi dati su un file, sto ricevendo un errore, e ho bisogno della soluzione più semplice, probabilmente imperfetta, in questo secondo.

A: Si dovrebbe leggere di Joel Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!) saggio sul set di caratteri.

D: SRY nessun codice di tempo pls

A: Fine. prova str('Some String') o 'Some String'.encode('ascii', 'ignore'). Ma dovresti davvero leggere alcune delle risposte e discussioni su Converting a Unicode string e this eccellente, eccellente, primer sulla codifica dei caratteri.

+6

Funziona se la stringa contiene solo testo ASCII *. In tutti gli altri casi dovrai codificare esplicitamente. –

+2

Questo tratta il "come qualcosa" per sbarazzarsi di ". Questo mi dice che in realtà non capisci di cosa si tratta. In genere non si vuole semplicemente "sbarazzarsi" di esso, e il modo corretto per fare una stringa di byte da una stringa Unicode dipende da cosa contiene quella stringa e in quale contesto. –

+1

@LennartRegebro totalmente d'accordo - questa è stata una risposta usa e getta che doveva essere presa in giro, ma ha accumulato una sorta di orribile numero di voti positivi. modificato per cercare di guidare la gente nella giusta direzione. – Andrew

1

È Unicode.

Basta inserire la variabile tra str() e funzionerà correttamente.

Ma nel caso in cui si dispone di due liste come la seguente:

a = ['co32','co36'] 
b = [u'co32',u'co36'] 

Se si spunta set(a)==set(b), verrà come False, ma se lo fai come segue:

b = str(b) 
set(a)==set(b) 

Ora, il il risultato sarà vero.

+0

Pericolo, pericolo. Non dovresti mai codificare un Unicode ('str()' o 'u '€' .encode()') senza passare una codifica. Se la stringa contiene non ASCII, l'utente riceverà UnicodeEncodeException. –

+0

Inoltre, il tuo codice non funziona. 'b = str (b)' dà semplicemente la stringa 'repr()' della lista, cioè 'b =" [u'co32 ', u'co36'] "'. Quindi 'set (a) == set (b) = False' –

0

Sono venuto qui perché avevo la sindrome di char-char sull'uscita requests. Pensavo che lo response.text mi avrebbe dato una stringa correttamente decodificata, ma nell'output ho trovato buffi caratteri a doppio carattere dove avrebbero dovuto essere le umlaut tedesche.

Risulta che lo response.encoding era vuoto in qualche modo e quindi la risposta non sapeva come decodificare correttamente il contenuto e appena trattato come ASCII (immagino).

La mia soluzione era ottenere i byte grezzi con "response.content" e applicare manualmente decode('utf_8') ad esso. Il risultato è stato schöne Umlaute.

L'correttamente decodificati

für

rispetto al impropriamente decodificato

für

Problemi correlati