Lorsque vous utilisez NodeJS pour écrire des outils frontaux, les fichiers texte les plus couramment utilisés sont les fichiers texte, la question de l'encodage des fichiers est donc également impliquée. Nos encodages de texte couramment utilisés sont UTF8 et GBK, et les fichiers UTF8 peuvent également contenir une nomenclature. Lors de la lecture de fichiers texte avec des encodages différents, le contenu du fichier doit être converti en chaîne codée UTF8 utilisée par JS avant de pouvoir être traité normalement.
Suppression de la nomenclature
BOM est utilisé pour marquer un fichier texte à l'aide du codage Unicode, qui est lui-même un caractère Unicode ("uFEFF") situé dans l'en-tête du fichier texte. Sous différents encodages Unicode, les octets binaires correspondant aux caractères de la nomenclature sont les suivants :
Bytes Encoding ---------------------------- FE FF UTF16BE FF FE UTF16LE EF BB BF UTF8
Par conséquent, nous pouvons déterminer si le fichier contient une nomenclature et quel encodage Unicode utiliser en fonction de l'égalité des premiers octets du fichier texte. Cependant, bien que le caractère BOM joue un rôle dans le marquage de l'encodage du fichier, il ne fait pas partie du contenu du fichier. Si la nomenclature n'est pas supprimée lors de la lecture du fichier texte, des problèmes surviendront dans certains scénarios d'utilisation. Par exemple, après avoir fusionné plusieurs fichiers JS en un seul fichier, si le fichier contient des caractères de nomenclature, cela provoquera des erreurs de syntaxe JS du navigateur. Par conséquent, lorsque vous utilisez NodeJS pour lire des fichiers texte, vous devez généralement supprimer la nomenclature. Par exemple, le code suivant implémente la fonction d'identification et de suppression de la nomenclature UTF8.
function readText(pathname) { var bin = fs.readFileSync(pathname); if (bin[0] === 0xEF && bin[1] === 0xBB && bin[2] === 0xBF) { bin = bin.slice(3); } return bin.toString('utf-8'); }
GBK vers UTF8
NodeJS prend en charge la spécification de l'encodage du texte lors de la lecture d'un fichier texte ou lors de la conversion d'un Buffer en chaîne, mais malheureusement, l'encodage GBK n'entre pas dans le cadre de la prise en charge propre de NodeJS. Par conséquent, nous utilisons généralement le package tiers iconv-lite pour convertir l'encodage. Après avoir téléchargé le package à l'aide de NPM, nous pouvons écrire une fonction pour lire le fichier texte GBK comme suit.
var iconv = require('iconv-lite'); function readGBKText(pathname) { var bin = fs.readFileSync(pathname); return iconv.decode(bin, 'gbk'); }
Encodage sur un seul octet
Parfois, nous ne pouvons pas prédire quel encodage le fichier que nous devons lire utilise, nous ne pouvons donc pas spécifier l'encodage correct. Par exemple, certains des fichiers CSS que nous devons traiter sont codés en GBK et d'autres en UTF8. Bien qu'il soit possible de deviner dans une certaine mesure le codage du texte en fonction du contenu en octets du fichier, ce que je vais présenter ici est une technique quelque peu limitée, mais beaucoup plus simple.
Tout d'abord, nous savons que si un fichier texte ne contient que des caractères anglais, tels que Hello World, alors il n'y aura aucun problème à lire le fichier en utilisant l'encodage GBK ou l'encodage UTF8. En effet, sous ces codages, les caractères compris entre ASCII0 et 128 utilisent le même codage sur un octet.
D'un autre côté, même s'il y a des caractères chinois et autres dans un fichier texte, si les caractères que nous devons traiter sont uniquement dans la plage ASCII0~128, comme le code JS à l'exception des commentaires et des chaînes, nous pouvons utiliser un seul octet de manière uniforme pour lire le fichier, pas besoin de se soucier de savoir si le codage réel du fichier est GBK ou UTF8. L’exemple suivant illustre cette approche.
1. Contenu du fichier source d'encodage GBK :
var foo = '中文';
2. Octet correspondant :
76 61 72 20 66 6F 6F 20 3D 20 27 D6 D0 CE C4 27 3B
3. Le contenu obtenu après lecture en utilisant un codage sur un octet :
var foo = '{乱码}{乱码}{乱码}{乱码}';
4. Contenu de remplacement :
var bar = '{乱码}{乱码}{乱码}{乱码}';
5. Les octets correspondants après enregistrement en utilisant le codage sur un seul octet :
76 61 72 20 62 61 72 20 3D 20 27 D6 D0 CE C4 27 3B
6. Utilisez l'encodage GBK pour lire et obtenir le contenu :
var bar = '中文';
L'astuce ici est que quels que soient les caractères tronqués dans lesquels un seul octet supérieur à 0xEF est analysé sous un codage sur un seul octet, lorsque ces caractères tronqués sont enregistrés en utilisant le même codage sur un seul octet, les octets correspondants derrière eux restent inchangés.
NodeJS est livré avec un encodage binaire qui peut être utilisé pour implémenter cette méthode, donc dans l'exemple suivant, nous utilisons cet encodage pour montrer comment écrire le code correspondant à l'exemple ci-dessus.
function replace(pathname) { var str = fs.readFileSync(pathname, 'binary'); str = str.replace('foo', 'bar'); fs.writeFileSync(pathname, str, 'binary'); }