Ces encodages existent pour les langages de programmation/systèmes de fichiers/protocoles réseau

L'article précédent a présenté l'encodage d'URL, l'encodage UTF8, base64, gzip et d'autres méthodes d'encodage et de décodage. Ici , cette section trie certains éléments divers de caractères et d'encodage, je pense que vous serez intéressé.

Caractères et encodages en Python

Pourquoi mettre l'accent sur le concept de séparation du nombre de caractères et de l'encodage des caractères ? Parce que dans un langage de programmation, l'un des aspects les plus importants est le traitement des caractères, un excellent langage de programmation devrait également clarifier ces deux concepts, et Python se trouve être un tel langage. Bien que la distinction ne soit pas particulièrement évidente en Python2, en Python3, il est clair d'utiliser la classe str pour représenter des chaînes ; les octets représentent des chaînes d'octets, qui peuvent être utilisées pour stocker des valeurs codées de chaînes, comme expliqué ci-dessous :

1. La classe str est utilisée dans Python3 pour représenter et stocker des chaînes. Le contenu stocké dans un objet chaîne spécifique est le numéro de chaque caractère, qui est attribué par le jeu de caractères. Quant au nombre utilisé pour le stockage en Python, il est souvent incertain. Par exemple, le nombre de caractères chinois couramment utilisés utilise généralement deux octets pour représenter le nombre. Pour certains caractères spéciaux (comme ceux de la musique), plus d'octets sont souvent nécessaires. C'est le mécanisme d'implémentation interne de Python, et je ne m'étendrai pas trop. Les étudiants intéressés peuvent étudier et essayer par eux-mêmes après avoir appris la méthode de cet article.
2. La classe bytes est utilisée dans Python 3 pour représenter et stocker des valeurs codées en chaîne. Étant donné que les caractères correspondent à plusieurs méthodes de codage, y compris UTF-8, UTF-16, UTF-32, GB2312, GBK, etc., la valeur stockée est généralement déterminée par la méthode de codage. Sous différentes méthodes de codage, le codage du chaîne est obtenue Les valeurs sont différentes les unes des autres; deuxièmement, les valeurs stockées dans l'objet bytes et l'objet str sont également différentes après l'encodage.

Prenons toujours les chaînes de mon nom de blog CSDN - garçon du village comme exemple, comme nous pouvons le voir dans le précédent :

1. Premièrement, les numéros Unicode de ces caractères sont respectivement 6751, 4E2D, 5C11 et 5E74.
2. Les valeurs encodées en UTF-8 sont E6 9D 91 E4 B8 AD E5 B0 91 E5 B9 B4

Ecrivez le programme suivant et visualisez le contenu de la mémoire correspondant à l'objet :

def printMem(data):
	from ctypes import string_at 
	from sys import getsizeof 
	from binascii import hexlify
	
	print(hexlify(string_at(id(data), getsizeof(data))))
if	name	== "	main	":

	nameStr = '村中少年' 
	nameBytes = nameStr.encode() 
	print(type(nameStr)) 
	print(type(nameBytes)) 
	printMem(nameStr) 
	printMem(nameBytes)

Le résultat de l'opération est le suivant :

<class 'str'>

<class 'bytes'>

b'0500000000000000c0f562b5417f000004000000000000001a53594d- c9e6e066a80a64b5417f00000000000000000000000000000000000000000000000000 000000000000000000`51672d4e115c745e`0000'

b'0300000000000000e0fe60b5417f00000c00000000000000ffffffffffffffff`e69d91e4b8ade5b091e5b9b4`00'

Les parties marquées représentent respectivement le numéro Unicode dans la chaîne et la valeur encodée en UTF-8. Vous pouvez voir que la valeur du numéro Unicode est bien stockée dans la chaîne nameStr, et la valeur encodée est stockée dans nameBytes. Vérifiez le début dit . Il s'agit de la prise en charge par Python des chaînes et des nombres au niveau du langage. Bien sûr, la partie non marquée est la valeur des autres parties de l'objet, ce qui n'est pas couvert dans cet article.

La figure 1 ci-dessous est une série d'opérations d'un fichier externe depuis sa formation jusqu'à sa lecture par Python 3 :
insérez la description de l'image ici

La figure 1
montre que la formation des fichiers, y compris la formation des fichiers de code source Python, est cohérente avec la séparation de l'affichage et du stockage décrite ci-dessus ; en même temps, lorsque Python 3 lit des fichiers, il est traité sous forme de chaînes par par défaut, c'est-à-dire converti en nombre Unicode, sauf indication explicite en tant que lecture binaire.

Pourquoi Python utilise-t-il des nombres pour représenter la chaîne elle-même ? En fait, c'est la même chose que la séparation précédente de l'affichage et du stockage.Peu importe où se trouve la chaîne, qu'elle soit écrite sur papier ou affichée sur l'ordinateur, sa signification reste inchangée, elle doit donc être représentée par une certaine valeur. de nombre. Cependant, lors du stockage, pour des raisons d'efficacité et d'autres aspects, il existe différentes méthodes de codage, et différentes méthodes de codage signifient des valeurs différentes, il n'est donc pas approprié d'utiliser des valeurs codées (non uniques) pour représenter des chaînes. L'utilisation précoce de l'ASCII, GB2312, qui ne fait pas la distinction entre l'encodage et la numérotation, n'est pas un gros problème, mais cela ne fonctionne pas dans le jeu de caractères Unicode. Grâce à cet article, je pense que vous devriez être en mesure de faire la distinction entre les chaînes et leurs méthodes d'encodage.

encodage du système de fichiers

Étant donné que l'encodage du système de fichiers est fondamentalement le même que celui du système d'exploitation, nous l'ignorons souvent. En fait, si vous déplacez des fichiers entre deux systèmes de fichiers différents, il est très facile d'obtenir des caractères brouillés dans le nom du fichier. Je pense que de nombreux étudiants ont rencontré ce problème. Étant donné que le nom de fichier du fichier est décodé et affiché par le système de fichiers, si le codage des deux systèmes de fichiers est différent, les caractères brouillés seront évidents. La raison derrière cela est en fait la même que le contenu du fichier brouillé, c'est-à-dire que les règles utilisées pour encoder l'écriture et l'affichage du décodage sont incohérentes. Souvent, l'un est écrit en GBK et l'autre est lu en UTF-8.

encodage du protocole réseau

Dans l'en-tête de protocole du protocole HTTP, il existe un tel champ, Content-Type : qui peut être utilisé pour dire au récepteur du protocole d'utiliser une méthode spécifiée pour décoder les données reçues, comme suit pour un en-tête de message HTTP :

GET / HTTP/1.1
Host: www.guoguo-app.com Connection: close

HTTP/1.1 200 OK
Content-Type: text/html;charset=utf-8 
Transfer-Encoding: chunked 
Connection: close
Vary: Accept-Encoding 
Vary: Accept-Encoding 
Content-Language: zh-CN 
Server: Tengine/Aserver

Vous pouvez voir que le serveur indique au client d'utiliser UTF-8 pour décoder le contenu des données reçues. Une fois que le navigateur ou le robot a analysé l'en-tête HTTP, il peut afficher correctement le contenu des données en décodant selon la méthode HTTP spécifiée, comme l'affichage un fichier texte en ligne. Bien sûr, je ne pense pas qu'il soit exact d'utiliser charset ici, car charset fait souvent référence à un jeu de caractères, et il est plus approprié d'utiliser charsetEncoding, bien que nous puissions tous comprendre sa signification.

codage Web

Dans les pages Web HTML, les balises suivantes sont généralement utilisées pour indiquer la méthode d'encodage adoptée par le HTML :

<meta charset="UTF-8">

Une fois que le navigateur a lu la balise du fichier, il affiche le fichier en codage utf8. Si le fichier HTML est stocké en GBK, le navigateur affichera des caractères brouillés car la méthode de décodage est erronée. Par conséquent, l'encodage réel du fichier HTML doit être le même que celui de la page Web, sinon des erreurs peuvent se produire. À ce stade, vous pouvez demander, que se passe-t-il si le Content-Type dans le protocole est incompatible avec le jeu de caractères méta de la page Web. À ce stade, le navigateur fera certainement un compromis. La pratique habituelle est que la priorité de l'en-tête de réponse du protocole est supérieure à celle de la page Web. Mais en fait, la façon dont les auteurs du navigateur l'implémentent dépend du spectateur.

Ce qui précède résume quelques points d'encodage et de caractères dans le système informatique, et j'espère qu'il vous sera utile.

Cet article est un article original rédigé par les jeunes du village de CSDN, et ne peut être reproduit sans autorisation. Le blogueur renvoie ici .

Je suppose que tu aimes

Origine blog.csdn.net/javajiawei/article/details/131198067
conseillé
Classement