web-dev-qa-db-fra.com

Quelle est la différence entre une chaîne et une chaîne d'octets?

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.

152
Sheldon

En supposant Python 3 (in 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 nicode codepoints ; il s’agit d’un concept abstrait qui ne peut pas être directement stocké sur le disque. Une chaîne d’octets est une séquence d’octets - sans surprise - choses que peut être stocké sur le disque. Le mappage entre eux est un encodage - il y en a beaucoup (et un nombre infini est possible) - et vous devez savoir lequel s'applique dans le cas particulier pour effectuer la conversion, car un codage différent peut mapper les mêmes octets sur 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 laquelle utiliser, vous pouvez utiliser la méthode .decode() de la chaîne d'octets pour obtenir la chaîne de caractères appropriée, comme ci-dessus. Pour être complet, la méthode .encode() d'une chaîne de caractères va dans le sens opposé:

>>> 'τoρνoς'.encode('utf-8')
b'\xcf\x84o\xcf\x81\xce\xbdo\xcf\x82'
204
lvc

La seule chose qu'un ordinateur peut stocker, ce sont des octets.

Pour stocker quoi que ce soit sur un ordinateur, vous devez d’abord encoder c’est-à-dire le convertir en octets. Par exemple:

  • Si vous voulez stocker de la musique, vous devez d'abord encoder utilisez-la en utilisant MP3, WAV, etc.
  • Si vous voulez stocker une image, vous devez d’abord encoder la en utilisant PNG, JPEG, etc.
  • Si vous voulez stocker du texte, vous devez d'abord encoder utilisez-le avec ASCII, UTF-8, Etc.

MP3, WAV, PNG, JPEG, ASCII et UTF-8 Sont des exemples de encodages. 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 chaîne d'octets avant de pouvoir être stocké dans un ordinateur.

D'autre part, 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 directement stockée sur un ordinateur, elle doit être codée d'abord (convertie en chaîne d'octets). Il existe plusieurs encodages permettant de convertir une chaîne de caractères en chaîne d'octets, tels que ASCII et UTF-8.

'I am a string'.encode('ASCII')

Le code ci-dessus Python encodera la chaîne 'I am a string' À l'aide de l'encodage ASCII. Le résultat du code ci-dessus sera une chaîne d'octets. Si vous l'imprimez, Python le représentera par b'I am a string'.) Cependant, rappelez-vous que les chaînes d'octets ne sont pas lisibles par l'homme, c'est simplement que Python les décode de ASCII lorsque vous les imprimez.En Python, une chaîne d'octets est représentée par un b, suivi de la représentation ASCII de la chaîne d'octets.

Une chaîne d'octets peut être décodée dans une chaîne de caractères, si vous connaissez le codage utilisé pour la coder.

b'I am a string'.decode('ASCII')

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 de pouvoir être lu par un humain.

303
Zenadix

In Python 2, str est constitué de séquences de valeurs de 8 bits, tandis que unicode est constitué de séquences de caractères Unicode. Il est important de garder à l'esprit que str et unicode peuvent être utilisés avec des opérateurs si str ne contient que des caractères ASCI 7 bits.

In Python, bytes est constitué de séquences de valeurs de 8 bits, tandis que str est constitué de séquences de caractères Unicode. bytes et str ne peuvent pas être utilisés avec des opérateurs tels que > ou +.

Il pourrait être utile d’utiliser des fonctions d’aide pour convertir entre str et unicode in Python 2, et entre bytes et str in Python 3.

11
lmiguelvargasf

De Qu'est-ce que Unicode :

Fondamentalement, les ordinateurs traitent uniquement des chiffres. Ils stockent des lettres et autres caractères en leur attribuant un numéro.

......

Unicode fournit un numéro unique pour chaque caractère, quelle que soit la plate-forme, quel que soit le programme, quelle que soit la langue.

Ainsi, lorsqu'un ordinateur représente une chaîne, il trouve les caractères stockés dans l'ordinateur de la chaîne par 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 la transmettre sur le réseau par le biais de leur numéro Unicode unique, car ces chiffres ne sont qu'un simple nombre décimal. Vous devez encoder la chaîne en chaîne d'octet, telle que UTF-8. UTF-8 est un encodage de caractères capable d'encoder tous les caractères possibles et stocke les caractères sous forme d'octets (il ressemble à this ). Donc, la chaîne encodée peut être utilisée partout car UTF-8 est presque pris en charge partout. Lorsque vous ouvrez un fichier texte encodé en UTF-8 à partir d’autres systèmes, votre ordinateur le décodera et y affichera des caractères grâce à leur numéro Unicode unique. Lorsqu'un navigateur reçoit des données de chaîne codées UTF-8 du réseau, il décodera les données en chaîne (supposons que le navigateur dans UTF-8 encodage) et affiche la chaîne.

En python3, vous pouvez transformer chaîne et chaîne d'octets entre elles:

>>> print('中文'.encode('utf-8'))
b'\xe4\xb8\xad\xe6\x96\x87'
>>> print(b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8'))
中文 

Dans un mot, la chaîne est destinée à l'affichage sur un ordinateur pour être lue sur un ordinateur et la chaîne d'octets est destinée à l'enregistrement sur disque et à la transmission de données.

3
Sam Yang