Qual è il prefisso u in una stringa Python?


232

Come in:

u'Hello'

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

In tal caso, da quando è disponibile?

Risposte:


147

Hai ragione, vedi 3.1.3. Stringhe Unicode .

È stata la sintassi da Python 2.0.

Python 3 li ha resi ridondanti, poiché il tipo di stringa predefinito è Unicode. Le versioni da 3.0 a 3.2 le hanno rimosse, ma sono state aggiunte nuovamente in 3.3+ per la compatibilità con Python 2 per favorire la transizione da 2 a 3.


6
Si dovrebbe aggiungere che non è più necessario in Python 3, ma una sintassi ancora valida.
Martin Thoma,

La combinazione di stringhe unicode + raw (regex) (ad es. ur"string") È valida in Python 2, ma purtroppo non è una sintassi non valida in Python 3.
cowlinator

123

L'U in u'Some String'significa che la tua stringa è una stringa Unicode .

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

A: Dovresti davvero leggere il minimo assoluto di Joel. Ogni saggio di sviluppatori di software assolutamente, positivamente, deve conoscere il set di caratteri Unicode e set di caratteri (senza scuse!) .

Q: sry no time code pls

Una multa. prova str('Some String')o 'Some String'.encode('ascii', 'ignore'). Ma dovresti davvero leggere alcune delle risposte e discussioni sul Conversione di una stringa Unicode e su questo eccellente, eccellente, primer sulla codifica dei caratteri.


6
Funziona se la stringa contiene solo testo ASCII . In tutti gli altri casi dovrai codificare esplicitamente.
Martijn Pieters

2
Questo tratta l'U '' come qualcosa di cui "sbarazzarsi". Questo mi dice che non capisci davvero di cosa si tratta. In genere non si vuole solo "liberarsene", e il modo corretto di creare una stringa di byte da una stringa Unicode dipende da cosa contiene quella stringa e in quale contesto.
Lennart Regebro,

2
@LennartRegebro era totalmente d'accordo: questa era una risposta usa e getta che doveva essere ironica, ma ha accumulato una sorta di numero orribile di voti. modificato per cercare di guidare la gente nella giusta direzione.
Andrew,

1
È stata una lettura divertente! Grazie! L'articolo ha 17 anni ed è ancora accurato. Wow.
Kerwin Sneijders,

52

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

Sì.

In tal caso, da quando è disponibile?

Python 2.x.

In Python 3.x le stringhe usano Unicode per impostazione predefinita e non è necessario il uprefisso. Nota: in Python 3.0-3.2, u è un errore di sintassi. In Python 3.3+ è di nuovo legale rendere più semplice la scrittura di app compatibili 2/3.


4
È persino un errore di sintassi in Python 3 utilizzare il uprefisso.
Tim Pietzcker,

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

@abarnert: Bene, quel commento ora ha quattro anni e mezzo :)
Tim Pietzcker,

3
@TimPietzcker: Certo, ma proprio come il tuo commento è stato un utile addendum per chiunque abbia trovato questa risposta utile tramite la ricerca nel 2010, penso che sia utile menzionare la modifica in 3.3 a chiunque la trovi nel 2014. Probabilmente sarebbe meglio modificare il risposta, ma penso che sia un punto secondario che la maggior parte delle persone non incontrerà (perché a meno che non si stia ancora utilizzando 3.0-3.2 nel 2014, "non è necessario il prefisso" è tutto ciò che è necessario sapere).
abarnert,

Se stai scrivendo codice per il download e l'esecuzione di utenti arbitrari e desideri coprire il maggior numero possibile di casi senza fare ipotesi, è utile sapere che 3.0-3.2 si interromperà. Perché devi decidere se ti interessa utilizzare six.text_type()ovunque per il numero (si spera minuscolo) delle persone che usano ancora 3. [012] - almeno le informazioni sono lì in modo che tu possa scegliere.
Dwanderson,

3

Sono venuto qui perché avevo la sindrome di char-char sulla mia requestsuscita. Pensavo response.textche mi avrebbe dato una stringa decodificata correttamente, ma nell'output ho trovato divertenti doppi caratteri in cui le umlaut tedesche avrebbero dovuto essere.

Si scopre che response.encodingera vuoto in qualche modo e quindi responsenon sapeva come decodificare correttamente il contenuto e lo trattava semplicemente come ASCII (immagino).

La mia soluzione era quella di ottenere i byte grezzi con 'response.content' e applicarli manualmente decode('utf_8'). Il risultato è stato Schöne Umlaute.

Decodificato correttamente

pelliccia

vs. impropriamente decodificato

für


2

Tutte le stringhe destinate agli umani dovrebbero usare "".

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

Prima che inizi il bashing, lasciami spiegare. La maggior parte dei programmi Python inizia con l'utilizzo ""di stringhe. Ma poi devono supportare la documentazione da Internet, quindi iniziano a usare "".decodee all'improvviso ottengono eccezioni ovunque sulla decodifica di questo e quello - tutto a causa dell'uso di ""stringhe. In questo caso, Unicode si comporta come un virus e causerà il caos.

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


bash -c "echo Shouldn\\'t you use b\\\"...\\\" for byte arrays?"
kennytm,

@KennyTM suona bene! Volevo semplicemente dire che tutte le stringhe pensate per gli umani dovrebbero essere usate u"".
Frank Krueger,

1
Se vuoi usare religiosamente Unicode ovunque - il che, per molte applicazioni (ma non tutte), è una buona cosa - quasi sicuramente vuoi Python 3.x, non 2.x. Ciò potrebbe non essere stato vero nel 2010 quando è stato scritto, ma nel 2014 la maggior parte delle librerie o piattaforme che ti impediscono di eseguire l'aggiornamento a 3.x ti impedirà anche di utilizzare Unicode correttamente ...
abarnert

1

È Unicode.

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

Ma nel caso in cui tu abbia due elenchi come il seguente:

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

Se controlli set(a)==set(b), verrà visualizzato come False, ma se fai come segue:

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

Ora, il risultato sarà True.


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à un UnicodeEncodeException.
Alastair McCormack,

3
Inoltre, il tuo codice non funziona. b = str(b)fornisce solo la stringa repr()dell'elenco, ad es b = "[u'co32', u'co36']". Quindiset(a)==set(b) = False
Alastair McCormack il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.