Je travaille avec une bibliothèque qui renvoie une chaîne d'octets et je dois la convertir en chaîne.
Bien que je ne sois pas sûr de la différence - le cas échéant.
En supposant Python 3 (en Python 2, cette différence est un peu moins bien définie) - une chaîne est une séquence de caractères, c'est-à-dire des points de code unicode ; il s'agit d'un concept abstrait qui ne peut pas être directement stocké sur disque. Une chaîne d'octets est une séquence, sans surprise, d'octets - des choses qui peuvent être stockées sur le disque. Le mappage entre eux est un codage - il y en a beaucoup (et infiniment possible) - et vous devez savoir ce qui s'applique dans le cas particulier afin de faire la conversion, car un codage différent peut mapper les mêmes octets à une chaîne différente:
>>> b'\xcf\x84o\xcf\x81\xce\xbdo\xcf\x82'.decode('utf-16')
'蓏콯캁澽苏'
>>> b'\xcf\x84o\xcf\x81\xce\xbdo\xcf\x82'.decode('utf-8')
'τoρνoς'
Une fois que vous savez lequel utiliser, vous pouvez utiliser la .decode()
méthode de la chaîne d'octets pour obtenir la bonne chaîne de caractères comme ci-dessus. Pour être complet, la .encode()
méthode d'une chaîne de caractères va dans le sens inverse:
>>> 'τoρνoς'.encode('utf-8')
b'\xcf\x84o\xcf\x81\xce\xbdo\xcf\x82'
str
type est le même que lebytes
type; cette réponse compare de manière équivalente leunicode
type (n'existe pas en Python 3) austr
type.str
objets Python 3 n'est ni accessible ni pertinente du côté Python; la structure des données n'est qu'une séquence de points de code. Sous PEP 393 , l'encodage interne exact est l'un de Latin-1, UCS2 ou UCS4, et une représentation utf-8 peut être mise en cache après sa première demande, mais même le code C est déconseillé de s'appuyer sur ces détails internes.La seule chose qu'un ordinateur peut stocker, ce sont des octets.
Pour stocker quoi que ce soit dans un ordinateur, vous devez d'abord le coder , c'est-à-dire le convertir en octets. Par exemple:
MP3
,WAV
etc.PNG
,JPEG
etc.ASCII
,UTF-8
etc.MP3
,WAV
,PNG
,JPEG
,ASCII
EtUTF-8
sont des exemples de codages . Un encodage est un format pour représenter l'audio, les images, le texte, etc. en octets.En Python, une chaîne d'octets n'est que cela: une séquence d'octets. Ce n'est pas lisible par l'homme. Sous le capot, tout doit être converti en une chaîne d'octets avant de pouvoir être stocké dans un ordinateur.
D'un autre côté, une chaîne de caractères, souvent simplement appelée "chaîne", est une séquence de caractères. Il est lisible par l'homme. Une chaîne de caractères ne peut pas être stockée directement dans un ordinateur, elle doit d'abord être codée (convertie en chaîne d'octets). Il existe plusieurs encodages grâce auxquels une chaîne de caractères peut être convertie en une chaîne d'octets, comme
ASCII
etUTF-8
.Le code Python ci-dessus encodera la chaîne en
'I am a string'
utilisant l'encodageASCII
. Le résultat du code ci-dessus sera une chaîne d'octets. Si vous l'imprimez, Python le représentera sous la formeb'I am a string'
. N'oubliez pas, cependant, que les chaînes d'octets ne sont pas lisibles par l'homme , c'est juste que Python les décodeASCII
lorsque vous les imprimez. En Python, une chaîne d'octets est représentée par unb
, suivi de laASCII
représentation de la chaîne d'octets .Une chaîne d'octets peut être décodée en une chaîne de caractères, si vous connaissez l'encodage qui a été utilisé pour l'encoder.
Le code ci-dessus renverra la chaîne d'origine
'I am a string'
.Le codage et le décodage sont des opérations inverses. Tout doit être encodé avant de pouvoir être écrit sur le disque, et il doit être décodé avant d'être lu par un humain.
la source
Remarque: Je développerai davantage ma réponse pour Python 3 car la fin de vie de Python 2 est très proche.
En Python 3
bytes
se compose de séquences de valeurs non signées 8 bits, tandis que sestr
compose de séquences de points de code Unicode qui représentent des caractères textuels de langues humaines.Même si
bytes
etstr
semblent travailler de la même façon, leurs instances ne sont pas compatibles les uns avec les autres, à savoir,bytes
et lesstr
cas ne peuvent pas être utilisés conjointement avec des opérateurs tels que>
et+
. De plus, gardez à l'esprit que la comparaisonbytes
et lesstr
instances pour l'égalité, c'est-à-dire l'utilisation==
, seront toujours évaluéesFalse
même lorsqu'elles contiennent exactement les mêmes caractères.Un autre problème lors de l'utilisation
bytes
etstr
est présent lors de l'utilisation de fichiers renvoyés à l'aide de laopen
fonction intégrée. D'une part, si vous ne voulez pas lire ou écrire de données binaires vers / depuis un fichier, ouvrez toujours le fichier en utilisant un mode binaire comme 'rb' ou 'wb'. D'un autre côté, si vous souhaitez lire ou écrire des données Unicode vers / depuis un fichier, faites attention au codage par défaut de votre ordinateur, donc si nécessaire passez leencoding
paramètre pour éviter les surprises.En Python 2
str
se compose de séquences de valeurs 8 bits, tandis que seunicode
compose de séquences de caractères Unicode. Une chose à garder à l' esprit est que ,str
etunicode
peut être utilisé conjointement avec les opérateurs sistr
seulement se compose de 7 bits des caractères ASCI.Il peut être utile d'utiliser des fonctions d'assistance pour convertir entre
str
etunicode
en Python 2, et entrebytes
etstr
en Python 3.la source
De ce qui est Unicode :
Ainsi, lorsqu'un ordinateur représente une chaîne, il trouve les caractères stockés dans l'ordinateur de la chaîne via leur numéro Unicode unique et ces chiffres sont stockés en mémoire. Mais vous ne pouvez pas écrire directement la chaîne sur le disque ou transmettre la chaîne sur le réseau via leur numéro Unicode unique car ces chiffres sont simplement un nombre décimal simple. Vous devez coder la chaîne en chaîne d'octets, telle que
UTF-8
.UTF-8
est un encodage de caractères capable d'encoder tous les caractères possibles et il stocke les caractères sous forme d'octets (il ressemble à ceci ). La chaîne encodée peut donc être utilisée partout car elleUTF-8
est presque prise en charge partout. Lorsque vous ouvrez un fichier texte encodé enUTF-8
à partir d'autres systèmes, votre ordinateur le décodera et y affichera les caractères via leur numéro Unicode unique. Lorsqu'un navigateur reçoit des données de chaîne codées àUTF-8
partir du réseau, il décode les données en chaîne (assumer le navigateur dans leUTF-8
codage) et affiche la chaîne.En python3, vous pouvez transformer les chaînes de caractères et les chaînes d'octets l'une à l'autre:
En un mot, la chaîne est destinée à être affichée aux humains pour être lue sur un ordinateur et la chaîne d'octets est destinée au stockage sur disque et à la transmission de données.
la source
Unicode est un format convenu pour la représentation binaire des caractères et différents types de formatage (par exemple minuscules / majuscules, nouvelle ligne, retour chariot), et d'autres "choses" (par exemple emojis). Un ordinateur n'est pas moins capable de stocker une représentation unicode (une série de bits), que ce soit en mémoire ou dans un fichier, que de stocker une représentation ascii (une série de bits différente), ou toute autre représentation (série de bits ).
Pour que la communication ait lieu, les parties à la communication doivent convenir de la représentation qui sera utilisée.
Parce que l'unicode cherche à représenter tous les caractères possibles (et autres "choses") utilisés dans la communication inter-humaine et inter-informatique, il nécessite un plus grand nombre de bits pour la représentation de nombreux caractères (ou choses) que d'autres systèmes de représentation qui chercher à représenter un ensemble plus limité de personnages / choses. Pour «simplifier» et peut-être pour tenir compte de l'utilisation historique, la représentation unicode est presque exclusivement convertie en un autre système de représentation (par exemple ascii) dans le but de stocker des caractères dans des fichiers.
Ce n'est pas le cas que l'unicode ne peut pas être utilisé pour stocker des caractères dans des fichiers, ou les transmettre via n'importe quel canal de communication, simplement que ce n'est pas le cas.
Le terme «chaîne» n'est pas défini avec précision. «Chaîne», dans son utilisation courante, fait référence à un ensemble de caractères / choses. Dans un ordinateur, ces caractères peuvent être stockés dans l'une des nombreuses représentations bit à bit différentes. Une "chaîne d'octets" est un ensemble de caractères stockés à l'aide d'une représentation qui utilise huit bits (huit bits étant appelés octets). Depuis, de nos jours, les ordinateurs utilisent le système Unicode (caractères représentés par un nombre variable d'octets) pour stocker des caractères en mémoire, et des chaînes d'octets (caractères représentés par des octets simples) pour stocker des caractères dans des fichiers, une conversion doit être utilisée avant que les caractères ne soient représentés en mémoire sera déplacé vers le stockage dans des fichiers.
la source
Ayons une simple chaîne d'un caractère
'š'
et encodons-la en une séquence d'octets:Aux fins de cet exemple, affichons la séquence d'octets sous sa forme binaire:
Maintenant, il n'est généralement pas possible de décoder les informations sans savoir comment elles ont été codées. Seulement si vous savez que l'
utf-8
encodage de texte a été utilisé, vous pouvez suivre l' algorithme de décodage utf-8 et acquérir la chaîne d'origine:Vous pouvez afficher le nombre binaire
101100001
sous forme de chaîne:la source
Les langages Python incluent
str
etbytes
en standard "Built-in Types". En d'autres termes, ce sont les deux classes. Je ne pense pas que cela vaille la peine d'essayer de rationaliser pourquoi Python a été implémenté de cette façon.Cela dit,
str
etbytes
sont très similaires les uns aux autres. Les deux partagent la plupart des mêmes méthodes. Les méthodes suivantes sont propres à lastr
classe:Les méthodes suivantes sont propres à la
bytes
classe:la source