853 votes

Exactement les drapeaux de chaîne « u » et « r » fais quoi en Python, et quels sont les littéraux de chaîne brute ?

Tout en posant cette question, j'ai réalisé que je n'en savais pas beaucoup sur les premières chaînes. Pour quelqu'un qui prétend être un Django formateur, ça craint.

Je sais ce que l'encodage, et je sais de quoi u seul fait depuis que je obtenir ce qui est de l'Unicode.

Mais qu'est - r faire exactement? Ce type de chaîne est-il le résultat?

Et par-dessus tout, ce que le diable n' ur ?

Enfin, est-il un moyen fiable pour revenir en arrière à partir d'une chaîne Unicode en une simple chaîne brute?

Ah, et en passant, si votre système et de votre éditeur de texte jeu de caractères sont définies en UTF-8, n' u de réellement faire quelque chose?

862voto

Alex Martelli Points 330805

Il n'y a pas vraiment de "première chaîne"; il y a des crus les littéraux de chaîne, qui sont exactement les littéraux de chaîne marquée par un 'r' avant le guillemet d'ouverture.

Une "première chaîne littérale" est une syntaxe légèrement différente pour un littéral de chaîne, dans lequel une barre oblique inverse, \, est prise en ce sens "juste une barre oblique inverse" (sauf quand il s'agit de droite avant d'un devis qui doit normalement prendre fin le littéral) - pas de "séquences d'échappement" pour représenter les retours à la ligne, tabulations, correction arrière, la forme d'avances, et ainsi de suite. Dans la normale des littéraux de chaîne, chaque barre oblique inverse doit être doublée pour éviter d'être considéré comme le début d'une séquence d'échappement.

Cette syntaxe variante existe surtout parce que la syntaxe d'expression régulière pattern est lourd avec des barres obliques inverses (mais jamais à la fin, de sorte que le "sauf" la clause ci-dessus n'a pas d'importance) et il semble un peu mieux quand vous éviter de doubler chacun d'entre eux-c'est tout. Il a également acquis une certaine popularité à exprimer les chemins de fichiers natif de Windows (avec les barres obliques inverses au lieu de régulier des barres obliques comme sur les autres plateformes), mais c'est très rarement nécessaire (étant donné que les barres obliques pour la plupart fonctionnent très bien sur Windows aussi) et à l'imparfait (en raison de "l'exception" de la clause ci-dessus).

r'...' est une chaîne d'octets (en Python 2.*), ru'...' et ur'...' sont des chaînes Unicode (encore une fois, en Python 2.*), et l'un des trois autres types de citer également produit exactement les mêmes types de chaînes de caractères (donc, par exemple, r'...', r'''...''', r"...", r"""...""" sont toutes les chaînes d'octets, et ainsi de suite).

Pas sûr de ce que tu veux dire par "aller retour" - il n'est pas intrinsèquement en arrière et en avant les directions, car il n'y a pas de matières string type, c'est juste une syntaxe alternative pour exprimer parfaitement normal objets string, byte ou unicode, car ils peuvent être.

Et oui, en Python 2.*, u'...' est bien sûr toujours distincte de la juste '...' - le premier est une chaîne unicode, ce dernier est une chaîne d'octets. L'encodage que la traduction littérale pourrait être exprimée en est complètement orthogonale de la question.

E. g., considérer (Python 2.6):

>>> sys.getsizeof('ciao')
28
>>> sys.getsizeof(u'ciao')
34

l'Unicode objet de cours prend plus d'espace mémoire (très petite différence pour une très courte chaîne, évidemment;-).

222voto

Mark Byers Points 318575

Il existe deux types de chaîne de caractères en python: le traditionnel str type et la plus récente, unicode type. Si vous tapez une chaîne de caractères littérale sans l' u à l'avant, vous obtenez le vieux - str type qui stocke les caractères 8 bits, et avec l' u à l'avant, vous obtenez les plus récentes unicode type qui peut stocker n'importe quel caractère Unicode.

L' r ne change pas le type à tous les, il change juste la façon dont le littéral de chaîne est interprétée. Sans l' r, les barres obliques inverses sont traités comme des caractères d'échappement. Avec l' r, les barres obliques inverses sont traités comme littéral. De toute façon, le type est le même.

ur est bien sûr une chaîne Unicode où les barres obliques inverses sont littéral barres obliques inverses, ne fait pas partie des codes d'échappement.

Vous pouvez essayer de convertir une chaîne Unicode en une vieille chaîne à l'aide de l' str() fonction, mais si il ya des caractères unicode qui ne peut être représenté dans l'ancienne chaîne, vous aurez une exception. Vous pourriez les remplacer par des points d'interrogation en premier si vous le souhaitez, mais bien sûr, ce serait la cause de ces caractères illisibles. Il n'est pas recommandé d'utiliser l' str type si vous souhaitez gérer correctement les caractères unicode.

77voto

pdxhiker Points 342

« chaîne brute » signifie qu'il est stocké tel qu’il apparaît. par exemple, ' \' est juste une barre oblique inverse au lieu d’une évasion.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X