Maison  >  Article  >  interface Web  >  À propos de l'encodage, du décodage et du traitement tronqué des caractères côté serveur Nodejs

À propos de l'encodage, du décodage et du traitement tronqué des caractères côté serveur Nodejs

不言
不言original
2018-06-30 11:12:372292parcourir

Cet article présente principalement le codage et le décodage avancés des caractères côté serveur et le traitement tronqué de Nodejs. Il a une certaine valeur de référence. Les amis intéressés peuvent s'y référer

Écrit devant<.>

Dans le développement de serveurs Web, l'encodage et le décodage des caractères doivent être traités presque quotidiennement. Une fois que l’encodage et le décodage ne sont pas gérés correctement, des caractères tronqués gênants apparaîtront.

De nombreux étudiants engagés dans le développement de serveurs de nœuds se retrouvent souvent perdus lorsqu'ils rencontrent des problèmes dus à une connaissance insuffisante des codes de codage de caractères et passent beaucoup de temps à dépanner et à résoudre des problèmes.

Le texte présente d'abord brièvement les connaissances de base du codage et du décodage de caractères, puis donne des exemples sur la façon de coder et de décoder dans un nœud, et enfin est un exemple de code côté serveur. Des exemples de code liés à cet article peuvent être trouvés ici.

À propos du codage et du décodage des caractères

Dans le processus de communication réseau, des bits binaires sont transmis, que le contenu envoyé soit du texte ou des images, la langue utilisée est c'est du chinois ou de l'anglais.

Par exemple, le client envoie "Bonjour" au serveur.

客户端 --- 你好 ---> 服务端

Ceci contient deux étapes clés, correspondant respectivement à l'encodage et au décodage.


1. Client : Encodez la chaîne "Bonjour" dans les bits binaires requis par le réseau informatique.


2. Serveur : Décodez les bits binaires reçus dans la chaîne "Bonjour".

Pour résumer :


1. Encodage : Convertissez les données qui doivent être transmises en bits binaires correspondants.


2. Décodage : convertissez les bits binaires en données originales.

Certains détails techniques importants ne sont pas mentionnés ci-dessus, les réponses se trouvent dans la section suivante.

  • Comment le client sait-il quels bits correspondent au caractère « Bonjour » ?

  • Une fois que le serveur a reçu les bits binaires, comment sait-il quelle est la chaîne correspondante ?

À propos des jeux de caractères et des encodages de caractères

Le problème de la conversion des caractères et des binaires est mentionné ci-dessus. Étant donné que les deux peuvent être convertis l'un en l'autre, c'est-à-dire qu'il existe des règles de conversion claires et que les caractères binaires e09be6022d700e04aeaa85a5f42fdcb2

Les règles de conversion mentionnées ici sont en fait les jeux de caractères et les encodages de caractères que nous entendons souvent.

Un jeu de caractères est un ensemble de caractères (texte, signes de ponctuation, etc.). Il existe de nombreux jeux de caractères, les plus courants incluent ASCII, Unicode, GBK, etc. La principale différence entre les différents jeux de caractères réside dans le nombre de caractères qu’ils contiennent.

Après avoir compris le concept de jeu de caractères, introduisons le codage des caractères.

Le jeu de caractères nous indique quels caractères sont pris en charge, mais la manière d'encoder des caractères spécifiques est déterminée par l'encodage des caractères. Par exemple, le jeu de caractères Unicode prend en charge les codages de caractères tels que UTF8 (couramment utilisé), UTF16 et UTF32.

Pour résumer :

  • Jeu de caractères : une collection de caractères. Différents jeux de caractères contiennent un nombre différent de caractères.

  • Encodage des caractères : l'encodage réel des caractères dans le jeu de caractères.

  • Un jeu de caractères peut avoir plusieurs méthodes de codage de caractères.

Vous pouvez considérer le codage de caractères comme une table de mappage. Le client et le serveur utilisent cette table de mappage pour implémenter la conversion de codage et de décodage de caractères et binaires.

Par exemple, le caractère « vous » occupe trois octets 0xe4 0xbd 0xa0 en codage UTF8, et occupe deux octets 0xc4 0xe3 en codage GBK.

Exemples d'encodage et de décodage de caractères

Les connaissances de base requises pour l'encodage et le décodage de caractères ont été mentionnées ci-dessus. Regardons un exemple simple ci-dessous, dans lequel nous utilisons la bibliothèque icon-lite pour nous aider à implémenter les opérations d'encodage et de décodage.

Comme vous pouvez le voir, nous utilisons gbk lors de l'encodage des caractères. Lors du décodage, si vous utilisez également gbk, vous pouvez obtenir les caractères originaux. Lorsque nous utilisons utf8 lors du décodage, des caractères tronqués apparaissent.

var iconv = require(&#39;iconv-lite&#39;);

var oriText = &#39;你&#39;;

var encodedBuff = iconv.encode(oriText, &#39;gbk&#39;);
console.log(encodedBuff);
// <Buffer c4 e3>

var decodedText = iconv.decode(encodedBuff, &#39;gbk&#39;);
console.log(decodedText);
// 你

var wrongText = iconv.decode(encodedBuff, &#39;utf8&#39;);
console.log(wrongText);
// ��

Exemple pratique : encodage et décodage côté serveur

Généralement, les scénarios dans lesquels nous devons traiter avec codage et décodage, fichiers Lecture, écriture et traitement des demandes réseau. Voici un exemple de requête réseau, présentant comment encoder et décoder côté serveur.

Supposons que nous exécutions le service http suivant, en écoutant les demandes des clients. Le client utilise le codage

lors de la transmission des données, tandis que le serveur utilise le codage gbk par défaut. utf8

Si la valeur par défaut

est utilisée pour décoder la demande à ce moment-là, des caractères tronqués apparaîtront, un traitement spécial est donc requis. utf8

Le code du serveur est le suivant (pour simplifier le code, le jugement de la méthode de requête et de l'encodage de la requête est ignoré ici)

var http = require(&#39;http&#39;);
var iconv = require(&#39;iconv-lite&#39;);

// 假设客户端采用post方法,编码为gbk
var server = http.createServer(function (req, res) {
  var chunks = [];
  
  req.on(&#39;data&#39;, function (chunk) {
    chunks.push(chunk)
  });

  req.on(&#39;end&#39;, function () {
    chunks = Buffer.concat(chunks);

    // 对二进制进行解码
    var body = iconv.decode(chunks, &#39;gbk&#39;);
    console.log(body);

    res.end(&#39;HELLO FROM SERVER&#39;);
  });

});

server.listen(3000);

correspondant Le code client est le suivant :

var http = require(&#39;http&#39;);
var iconv = require(&#39;iconv-lite&#39;);

var charset = &#39;gbk&#39;;

// 对字符"你"进行编码
var reqBuff = iconv.encode(&#39;你&#39;, charset);

var options = {
  hostname: &#39;127.0.0.1&#39;,
  port: &#39;3000&#39;,
  path: &#39;/&#39;,
  method: &#39;POST&#39;,
  headers: {
    &#39;Content-Type&#39;: &#39;text/plain&#39;,
    &#39;Content-Encoding&#39;: &#39;identity&#39;,
    &#39;Charset&#39;: charset // 设置请求字符集编码
  }
};

var client = http.request(options, function(res) {
  res.pipe(process.stdout);
});

client.end(reqBuff);

Ce qui précède est l'intégralité du contenu de cet article. J'espère qu'il sera utile à l'apprentissage de chacun. Pour plus de contenu connexe, veuillez faire attention à PHP Chinese net !

Recommandations associées :

À propos de la fonction de communication simple entre le serveur socket nodejs et le client

Comment utiliser ES6 dans un projet NodeJS

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn