Avant-propos
Il est très facile d'avoir des problèmes avec l'encodage des caractères. Nous devons garder quelques mots à l'esprit :
1. Quel encodage est utilisé pour l'enregistrer doit être ouvert avec le. même encodage
2. L'exécution du programme consiste à lire d'abord le fichier dans la mémoire
3. Unicode est l'encodage parent et ne peut être encodé et décodé que dans d'autres formats d'encodage
UTF-8, GBK ce sont des codages sub-8 qui ne peuvent être décodés qu'en Unicode
1. Qu'est-ce que le codage de caractères
Nous savons que les ordinateurs ne peuvent reconnaître que le binaire, et le les codes que nous écrivons habituellement doivent être convertis en binaire pour être reconnus par l'ordinateur. Alors, comment convertir les caractères que nous écrivons en binaire ? Ce processus utilise en fait une norme pour faire correspondre les caractères que nous écrivons à des nombres spécifiques. Cette norme est appelée codage de caractères.
Caractères ------ (Encodage des caractères) -------> Nombres
2. Historique de développement de l'encodage des caractères
1.Code ASCII
Les ordinateurs sont originaires des États-Unis et le codage des caractères est également originaire des États-Unis. Mais les caractères utilisés par le peuple américain ne comportent que 26 lettres, plus quelques symboles spéciaux. Contrairement à la Chine, les élèves du primaire doivent connaître des milliers de caractères chinois. Ainsi, les Américains utilisent le code ASCII (American Standard Code for Information Interchange) comme codage de caractères. Un octet représente un caractère 1 octet = 8 bits, ce qui représente 256 changements différents, mais initialement seulement les 7 premiers. ont été utilisés, soit 127 caractères, ce qui est suffisant pour le peuple américain (bien sûr pour des raisons de coût). Plus tard, le latin a été compilé en 8ème position. À ce stade, les codes ASCII sont pleins et les pays anglophones et latins peuvent jouer avec bonheur. 2. GBK , en 1980, l'Administration d'État des normes a publié le codage de caractères utilisé en chinois -> GBK, qui utilise deux octets pour représenter un caractère chinois, de sorte qu'il y ait 2 à la puissance 16, soit 65 536 combinaisons, ce qui est suffisant pour les caractères chinois.
Dans le même temps, d'autres pays ont également publié leurs propres normes nationales de codage de caractères, telles que shift_JIS au Japon, Euc-kr en Corée du Sud, etc.
3.Unicode
On dit qu'il y avait des centaines d'encodages de caractères à leur apogée, et ils ne se soutenaient pas les uns les autres. courageux, mais ce n'est pas propice au monde Interopérable, c'est pourquoi Unicode est né. En 1994, l'Organisation internationale de normalisation a publié Unicode, connu sous le nom de Code universel, qui utilise deux octets pour représenter un caractère et compte 65 536 combinaisons, ce qui peut déjà couvrir la plupart des langues du monde.
4.utf-8
Bien qu'Unicode soit bon, il y a un problème en anglais qui pourrait maintenant être exprimé en un octet. utilisez deux octets, l'espace de stockage est doublé, ce qui n'est évidemment pas parfait, c'est pourquoi UTF-8 a été créé, qui n'utilise que 1 octet pour les caractères anglais et 3 octets pour les caractères chinois.
5. Tous les caractères Unicode font deux octets, ce qui est simple et grossier. La conversion des caractères en nombres est rapide, mais elle prend beaucoup d'espace de stockage
UTF-8 utilise différentes longueurs pour représenter différents caractères, économisant ainsi de l'espace, mais l'efficacité de la conversion n'est pas aussi rapide qu'Unicode
L'encodage des caractères utilisé dans la mémoire est Unicode, et la mémoire est pour accélérer Oui, donc je préfère sacrifier un peu d'espace pour assurer la vitesse
Le disque dur et la transmission réseau utilisent utf-8, car le disque Le délai d'E/S ou d'E/S réseau est bien supérieur à l'efficacité de la conversion utf -8, et la bande passante doit être économisée autant que possible lors de la transmission réseau
3. > La première étape : l'interpréteur python démarre, ce qui est assez Yu a démarré un éditeur de texteLa deuxième étape : l'interpréteur python sert d'éditeur de texte pour ouvrir le fichier t.py et lire le contenu du t .py du disque dur vers la mémoire
La troisième étape : l'interpréteur python interprète et exécute le code de t.py qui vient d'être chargé en mémoireDans la deuxième étape, le fichier t.py a un encodage de caractères lors de l'enregistrement, la même méthode d'encodage doit être spécifiée lorsque l'interpréteur Python ouvre le fichier (la méthode d'encodage par défaut de Python2 est ASCII, et la méthode d'encodage par défaut de Python3 est utf- 8). Si le format d'encodage du fichier enregistré est différent de la méthode d'encodage par défaut de l'interpréteur Python, il vous suffit d'écrire #coding: au début du fichier pour indiquer à l'interpréteur Python de ne pas utiliser sa méthode d'encodage par défaut pour read, mais pour lire le fichier dans la méthode spécifiée par le fichier d'en-tête, afin qu'il n'y ait pas d'erreurs.
La troisième étape : Lire le code qui a été chargé en mémoire (Unicode par défaut), puis l'exécuter Lors du processus d'exécution, si une opération comme la définition d'une variable est rencontrée, un nouvel espace mémoire sera ouvert. dans la mémoire. Veuillez noter à ce stade que l'espace mémoire nouvellement ouvert n'est pas nécessairement Unicode. L'utilisateur peut spécifier la méthode d'encodage lors de la définition de la variable. L'espace mémoire ouvert lors de la définition n'est qu'un espace et peut stocker des codes dans n'importe quel format d'encodage. Prenons Python3 comme exemple
4 Encodage et décodage
Enregistrer des fichiers consiste à enregistrer des fichiers dans. mémoire Vers le disque dur
La lecture de fichiers consiste à lire les fichiers du disque dur dans la mémoire
Unicode est l'encodage parent, utf-8, GBK sont les encodages enfants. Si le sous-code veut être converti en d'autres codes, il doit d'abord être converti en code parent, puis converti du code parent en d'autres sous-codes
Le décodage est le décodage, qui est le décodage. processus de conversion du sous-code en code parent Unicode
L'encodage est un encodage, qui est le processus de conversion d'Unicode en d'autres encodages
Comme mentionné précédemment, lorsqu'un fichier est lu en mémoire, il devient Encodage Unicode (bien sûr, c'est la valeur par défaut, et peut également être modifié selon les instructions), Le processus de lecture des fichiers du disque dur consiste à décoder l'utf-8 du disque dur en Unicode
Lors de l'enregistrement le fichier, c'est le processus de sauvegarde de la mémoire sur le disque dur. Le disque dur est codé en utf-8 et doit être codé par Unicode en utf-8
5. La différence entre Python2. et Python3
1. La méthode d'encodage par défaut de Python2 est ASCII Lors de l'ouverture d'un fichier enregistré en utf-8, une erreur sera signalée au fichier d'en-tête #coding : utf-8.
str en Python2 est reconnu comme Bytes, donc str en Python2 est le résultat de l'encodage. En fait, il fera une chose par défaut, c'est-à-dire ajouter un u devant str First Convert to Unicode, encoder en octets
Il existe deux types de chaînes dans Python2, str et Unicode str peuvent être convertis en Unicode en ajoutant un 'u' devant
2. L'encodage par défaut de python 3 est. utf-8, vous pouvez ouvrir directement les fichiers enregistrés avec utf-8
str dans Python3 est reconnu comme Unicode
Il existe également deux types de chaînes dans Python3 (bytes et str), mais bytes est octets, str est unicode
6. Imprimer sur le terminal
Tout d'abord, vous devez savoir que le paramètre par défaut du terminal Windows Le la méthode d'encodage est GBK
Le terminal est également une application et s'exécute en mémoire, donc le processus d'impression avec print() se fait de mémoire en mémoire. Ainsi, pour Unicode, quelle que soit la façon dont vous imprimez, il n'y aura pas d'erreur. Cependant, dans Python2, à l'exception de la chaîne avec « u » ajoutée, les autres chaînes sont des octets. À l'heure actuelle, le terminal utilise le codage GBK, tandis que Python2 utilise. le code utf-8 spécifié ou le code Ascii par défaut, une erreur se produira lors de l'impression dans le terminal.
Voici ma compréhension actuelle. Si je me rends compte d'erreurs ou d'expressions peu claires à l'avenir, je les réviserai. Hélas, l'encodage des caractères est un écueil
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!