Qu'est - 'b' à faire face à un littéral de chaîne?
Apparemment, ce qui suit est valable syntaxe
my_string = b'The string'
Je voudrais savoir:
- Qu'est-ce
b
personnage en face de la chaîne veux dire? - Quels sont les effets de l'aide?
- Quelles sont les situations appropriées à utiliser?
J'ai trouvé un une question relative à la ici sur le cas, mais que la question est à propos de PHP si, et il énonce la b
est utilisé pour indiquer que la chaîne est binaire, par opposition à l'Unicode, ce qui était nécessaire pour que le code soit compatible à partir de la version de PHP < 6, lors de la migration de PHP 6. Je ne pense pas que cela s'applique à Python.
Je n'ai trouver cette documentation sur le Python site sur l'utilisation d'un u
caractère dans le même syntaxe pour spécifier une chaîne de caractères au format Unicode. Malheureusement, il ne mentionne pas l' b caractère de n'importe où dans le document.
Aussi, juste par curiosité, il y a plus de symboles que l' b
et u
que faire d'autres choses?
Vous devez vous connecter pour publier un commentaire.
Pour citer le Python 2.x de la documentation:
La Python 3 de la documentation états:
unicode_literals
de__future__
, cette volonté "d'inverser" le comportement de cette chaîne particulière (en Python 2.x)Python 3.x fait clairement la distinction entre les types:
str
='...'
littéraux = une séquence de caractères Unicode (UTF-16 ou UTF-32, selon la façon Python a été compilé)bytes
=b'...'
littéraux = une séquence d'octets (les entiers entre 0 et 255)Si vous êtes familier avec Java ou C#, pensez à
str
commeString
etbytes
commebyte[]
. Si vous êtes familier avec SQL, pensez àstr
commeNVARCHAR
etbytes
commeBINARY
ouBLOB
. Si vous êtes familier avec le registre de Windows, pensez àstr
commeREG_SZ
etbytes
commeREG_BINARY
. Si vous êtes familier avec le C(++), alors oubliez tout ce que vous avez appris à propos dechar
et les chaînes, parce UN PERSONNAGE n'EST PAS UN OCTET. Cette idée est long obsolètes.Vous utilisez
str
quand vous voulez pour représenter le texte.Vous utilisez
bytes
quand vous voulez représenter faible niveau des données binaires comme des structures.Vous pouvez coder un
str
à unbytes
objet.Et vous pouvez décoder un
bytes
dans unstr
.Mais vous ne pouvez pas combiner les deux types.
La
b'...'
la notation est un peu confus en ce qu'il permet les octets 0x01-0x7F être spécifié de caractères ASCII au lieu de nombres hexadécimaux.Mais je me dois de souligner, un personnage n'est pas un octet.
En Python 2.x
Pré-3.0 versions de Python n'a plus ce genre de distinction entre texte et des données binaires. Au lieu de cela, il y avait:
unicode
=u'...'
littéraux = séquence de caractères Unicode = 3.xstr
str
='...'
littéraux = séquences de confondus octets/caractèresstruct.pack
de sortie.Afin de faciliter les 2.x-pour-3.x de transition, le
b'...'
la syntaxe littérale a été reporté à la version 2.6 de Python, afin de permettre de distinguer les chaînes binaires (qui devrait êtrebytes
en 3.x) à partir de chaînes de texte (qui doit êtrestr
en 3.x). Leb
préfixe ne fait rien en 2.x, mais raconte l'2to3
script n'est pas à la convertir en une chaîne Unicode en 3.x.Donc oui,
b'...'
littéraux en Python ont le même but qu'ils n'en PHP.La
r
préfixe crée une chaîne brute (par exemple,r'\t'
est une barre oblique inverse +t
au lieu d'un onglet), et entre guillemets triples'''...'''
ou"""..."""
de permettre le multi-ligne littéraux de chaîne.'A' == b'A' --> False
case vraiment, il est clair. Le reste est excellent, mais jusqu'à ce point, je n'avais pas bien compris qu'une chaîne d'octets est pas vraiment de texte.'שלום עולם' == 'hello world'
.decode('UTF-8')
. Était à la recherche pour savoir comment changer mon b' chaîne de caractères reçue du serveur de POSTE demande de retour à l'unicode.A CHARACTER IS NOT A BYTE
est une fausse déduction logique à partir du C++ projet. C++ n'a jamais eu ce genre de "idée". C++ définit un octet comme unaddressable unit of data storage large enough to hold any member of the basic character set of the execution environment
. C'est comme dire d'un verre peut contenir de l'eau. Chaque eau est un verre.u
,b
,r
, Python 3.6, introduire f-chaîne pour la mise en forme de chaîne. Exemplef'The temperature is {tmp_value} Celsius'
(b'\xE2\x82\xAC').decode('UTF-8')
travaillé.Le b désigne une chaîne d'octets.
Octets sont les données réelles. Les chaînes sont une abstraction.
Si vous aviez multi-chaîne de caractères de l'objet et vous avez pris un caractère unique, il serait une chaîne, et il pourrait être plus que 1 octet de la taille en fonction de l'encodage.
Si a fallu 1 octet avec une chaîne d'octets, vous devez obtenir une seule valeur de 8 bits de 0 à 255 et il pourrait ne pas représenter un ensemble complet de caractères si ces caractères de codage ont été > 1 octet.
TBH j'avais utilisation de chaînes à moins que j'ai eu quelques faible niveau de la raison de l'utilisation d'octets.
Il le transforme en un
bytes
littérale (oustr
en 2.x), et est valable pour 2,6+.La
r
préfixe causes inverses à être "mal interprétés" (pas ignoré, et la différence ne question).str
en 2.x de toute façon, de sorte qu'il pourrait être dit qu'il est ignoré. La distinction est particulièrement importante lorsque vous importezunicode_literals
de la__future__
module.Depuis le côté serveur,si nous envoyons toute réponse, il sera envoyé dans la forme de type octet.Elle apparaîtra dans le client
b'Response du serveur"
Afin de se débarrasser de b'....' utilisez simplement le code ci-dessous
serveur de fichier
fichier client
alors il sera d'impression
Réponse du serveur
Voici un exemple où l'absence de " b " jeter une exception TypeError en Python 3.x
L'ajout d'un préfixe 'b' peut résoudre le problème.
En plus de ce que les autres ont dit, notez qu'un seul caractère unicode peut se composer de plusieurs octets.
La façon unicode œuvres, c'est qu'il a fallu à l'ancien format ASCII (7 bits de code qui ressemble à 0xxx xxxx) et ajouté multi-octets séquences où tous les octets commençant à 1 (1xxx xxxx) pour représenter les caractères au-delà de l'ASCII, de sorte que Unicode serait rétro-compatible avec l'ASCII.
Vous pouvez utiliser JSON pour le convertir en dictionnaire
{"key":"valeur"}
FLACON:
Ceci est un exemple de flacon. Exécuter sur le terminal de ligne:
Dans flask/routes.py
{"key": "valeur"}