Quel est le préfixe u dans une chaîne Python?

232

Comme dans:

u'Hello'

Je suppose que cela indique "Unicode", est-ce correct?

Si oui, depuis quand est-il disponible?

OscarRyz
la source

Réponses:

147

Vous avez raison, voir 3.1.3. Chaînes Unicode .

C'est la syntaxe depuis Python 2.0.

Python 3 les rendait redondants, car le type de chaîne par défaut est Unicode. Les versions 3.0 à 3.2 les ont supprimées, mais elles ont été rajoutées dans 3.3+ pour la compatibilité avec Python 2 pour faciliter la transition 2 à 3.

Stefan Kendall
la source
6
Il faut ajouter que ce n'est plus nécessaire en Python 3, mais toujours une syntaxe valide.
Martin Thoma
La combinaison de chaînes unicode + raw (regex) (par exemple ur"string") est valide en Python 2, mais c'est malheureusement une syntaxe non valide en Python 3.
cowlinator
123

Le u dans u'Some String'signifie que votre chaîne est une chaîne Unicode .

Q: Je suis terriblement pressé et j'ai atterri ici à partir de la recherche Google. J'essaie d'écrire ces données dans un fichier, j'obtiens une erreur et j'ai besoin de la solution la plus simple, probablement défectueuse, cette seconde.

R: Vous devriez vraiment lire le minimum absolu de Joel, chaque développeur de logiciels doit absolument, positivement, connaître l'essentiel sur l'Unicode et les jeux de caractères (sans excuses!) Sur les jeux de caractères.

Q: essayez pas de code temporel pls

Une amende. essayez str('Some String')ou 'Some String'.encode('ascii', 'ignore'). Mais vous devriez vraiment lire certaines des réponses et discussions sur la conversion d'une chaîne Unicode et cet excellent, excellent, amorce sur le codage de caractères.

Andrew
la source
6
Cela fonctionne si la chaîne contient uniquement du texte ASCII . Dans tous les autres cas, vous devrez encoder explicitement.
Martijn Pieters
2
Cela traite le u '' comme quelque chose "dont on doit se débarrasser". Cela me dit que vous ne comprenez pas vraiment ce que c'est. En règle générale, vous ne voulez pas simplement "vous en débarrasser", et la manière correcte de créer une chaîne d'octets à partir d'une chaîne Unicode dépend de ce que cette chaîne contient et dans quel contexte.
Lennart Regebro
2
@LennartRegebro était tout à fait d'accord - c'était une réponse jetable qui était censée être ironique, mais elle a accumulé une sorte de nombre horrible de votes positifs. modifié pour essayer d'orienter les gens dans la bonne direction.
Andrew
1
C'était une lecture amusante! Merci! L'article a 17 ans et il est toujours exact. Sensationnel.
Kerwin Sneijders
52

Je suppose que cela indique "Unicode", est-ce correct?

Oui.

Si oui, depuis quand est-il disponible?

Python 2.x.

Dans Python 3.x, les chaînes utilisent Unicode par défaut et le upréfixe n'est pas nécessaire . Remarque: dans Python 3.0-3.2, le u est une erreur de syntaxe. Dans Python 3.3+, c'est à nouveau légal pour faciliter l'écriture des 2/3 applications compatibles.

kennytm
la source
4
C'est même une erreur de syntaxe en Python 3 pour utiliser le upréfixe.
Tim Pietzcker
14
@TimPietzcker: uniquement dans 3.0-3.2; dans la version 3.3+, elle est légale (et vide de sens), pour faciliter l'écriture de bibliothèques et d'applications à base de code unique 2.6 + / 3.3 +.
abarnert
@abarnert: Eh bien, ce commentaire a maintenant quatre ans et demi :)
Tim Pietzcker
3
@TimPietzcker: Bien sûr, mais tout comme votre commentaire était un addendum utile pour quiconque trouvant cette réponse utile par recherche en 2010, je pense qu'il est utile de mentionner le changement de 3.3 à quiconque la trouvant en 2014. Il serait peut-être préférable de modifier le réponse, mais je pense que c'est un point mineur que la plupart des gens ne rencontreront pas (car à moins que vous n'utilisiez toujours 3.0-3.2 en 2014, "pas besoin de préfixe" est tout ce que vous devez savoir).
abarnert
Si vous écrivez du code à télécharger et à exécuter par des utilisateurs arbitraires et que vous souhaitez couvrir le plus de cas possibles sans faire d'hypothèses, il est utile de savoir que la version 3.0-3.2 se cassera. Parce que vous devez décider si vous souhaitez l'utiliser six.text_type()partout pour le nombre (espérons-le minuscule) de personnes utilisant encore 3. [012] - au moins les informations sont là pour que vous puissiez choisir.
dwanderson
3

Je suis venu ici parce que j'avais un syndrome drôle de char sur ma requestssortie. Je pensais que response.textcela me donnerait une chaîne correctement décodée, mais dans la sortie, j'ai trouvé des doubles caractères amusants où les trémas allemands auraient dû être.

Il s'est avéré response.encodingêtre vide en quelque sorte et donc responseje ne savais pas comment décoder correctement le contenu et je l'ai juste traité en ASCII (je suppose).

Ma solution était d'obtenir les octets bruts avec 'response.content' et de l'appliquer manuellement decode('utf_8'). Le résultat a été schöne Umlaute.

Le correctement décodé

fourrure

contre le mal décodé

fĂźr

Chris
la source
2

Toutes les chaînes destinées aux humains doivent utiliser u "".

J'ai trouvé que l'état d'esprit suivant aide beaucoup lorsqu'il s'agit de chaînes Python: Toutes les chaînes de manifeste Python doivent utiliser la u""syntaxe. La ""syntaxe concerne uniquement les tableaux d'octets.

Avant que le dénigrement ne commence, laissez-moi vous expliquer. La plupart des programmes Python commencent par utiliser ""des chaînes de caractères. Mais ensuite, ils doivent prendre en charge la documentation sur Internet, alors ils commencent à utiliser "".decodeet tout d'un coup, ils obtiennent des exceptions partout sur le décodage de ceci et cela - tout cela à cause de l'utilisation de ""for strings. Dans ce cas, Unicode agit comme un virus et fera des ravages.

Mais, si vous suivez ma règle, vous n'aurez pas cette infection (car vous serez déjà infecté).

Frank Krueger
la source
bash -c "echo Shouldn\\'t you use b\\\"...\\\" for byte arrays?"
kennytm
@KennyTM Sonne bien! Signifiait simplement que toutes les chaînes destinées aux humains devraient être utilisées u"".
Frank Krueger
1
Si vous souhaitez utiliser religieusement Unicode partout - ce qui, pour de nombreuses applications (mais pas toutes), est une bonne chose - vous voulez presque certainement Python 3.x, pas 2.x. Cela n'était peut-être pas le cas en 2010 au moment de la rédaction, mais en 2014, la plupart des bibliothèques ou des plates-formes qui vous empêchent de passer à 3.x vous empêcheront également d'utiliser correctement Unicode…
abarnert
1

C'est Unicode.

Mettez simplement la variable entre str(), et cela fonctionnera bien.

Mais au cas où vous auriez deux listes comme celle-ci:

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

Si vous cochez set(a)==set(b), cela sera faux, mais si vous procédez comme suit:

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

Maintenant, le résultat sera vrai.

user3251882
la source
Danger, danger. Vous ne devez jamais encoder un Unicode ( str()ou u'€'.encode()) sans passer un encodage. Si la chaîne contient des caractères non ASCII, l'utilisateur recevra une exception UnicodeEncodeException.
Alastair McCormack
3
De plus, votre code ne fonctionne pas. b = str(b)donne juste la chaîne repr()de la liste, ie b = "[u'co32', u'co36']". Puisset(a)==set(b) = False
Alastair McCormack