Maison  >  Article  >  interface Web  >  nodejs est toujours tronqué

nodejs est toujours tronqué

WBOY
WBOYoriginal
2023-05-13 19:05:35588parcourir

Node.js est un environnement d'exécution JavaScript côté serveur très populaire. Il présente les avantages d'être léger, efficace et facile à développer. Il est largement utilisé dans les applications Web, les outils de ligne de commande, l'Internet des objets et d'autres domaines. dans certains cas, il rencontrera encore des problèmes, tels que des caractères tronqués. Dans cet article, nous explorerons les causes et les solutions aux problèmes tronqués de Node.js.

1. La cause du problème de code tronqué

  1. Encodage de caractères incohérent

Dans Node.js, les chaînes JavaScript utilisent l'encodage UTF-8 par défaut, mais dans certains cas, comme la lecture de fichiers, la requête du réseau et autres opérations, retour La chaîne n'est pas nécessairement codée en UTF-8. Si le programme ne gère pas correctement cette situation, des caractères tronqués peuvent facilement apparaître.

Par exemple, lorsque nous lisons un fichier texte encodé en GBK, si nous ne précisons pas le format d'encodage, nous rencontrerons facilement des caractères tronqués :

const fs = require('fs');

fs.readFile('file.txt', (err, data) => {
  if (err) throw err;
  console.log(data.toString()); // 输出乱码
})

La solution est de spécifier le bon format d'encodage lors de la lecture du fichier, comme :

const fs = require('fs');

fs.readFile('file.txt', { encoding: 'GBK' }, (err, data) => {
  if (err) throw err;
  console.log(data.toString()); // 输出正确的文本
})
  1. L'en-tête de réponse ne spécifie pas le jeu de caractères

Dans le serveur Node.js, lorsque le client initie une requête et obtient la réponse, le codage des caractères du contenu de la réponse doit être spécifié dans l'en-tête de réponse . Si le jeu de caractères n'est pas spécifié dans l'en-tête de la réponse, ou si le jeu de caractères spécifié est incohérent avec le jeu de caractères réellement utilisé, des caractères tronqués apparaîtront.

Par exemple, nous utilisons le framework Express pour créer un serveur HTTP. Si le texte HTML renvoyé ne précise pas l'encodage, il est facile de rencontrer des caractères tronqués :

const express = require('express');
const app = express();

app.get('/', (req, res) => {
  res.send('<html><body>中文</body></html>'); // 输出乱码
});

app.listen(8080, () => {
  console.log('Server started on http://localhost:8080/');
});

La solution est de spécifier clairement le jeu de caractères de la réponse. contenu dans l'en-tête de réponse, tel que :

const express = require('express');
const app = express();

app.get('/', (req, res) => {
  res.set('Content-Type', 'text/html; charset=utf8');
  res.send('<html><body>中文</body></html>'); // 输出正确的文本
});

app.listen(8080, () => {
  console.log('Server started on http://localhost:8080/');
});
  1. Encodage de base de données incohérent

Dans Node.js, lors de l'interaction avec la base de données, parfois l'encodage de la base de données est incohérent avec l'encodage des caractères Node.js. Par exemple, dans la base de données MySQL, les codages de caractères couramment utilisés sont latin1 et utf8, tandis que le codage par défaut de Node.js est utf8. Si nous ne spécifions pas le codage lors de l'interrogation, des caractères tronqués peuvent apparaître.

Par exemple, nous utilisons le module mysql pour interroger la base de données MySQL. Si l'encodage n'est pas spécifié, il est facile de rencontrer le problème du code tronqué :

const mysql = require('mysql');

const connection = mysql.createConnection({
  host: 'localhost',
  user: 'root',
  password: 'password',
  database: 'test'
});

connection.connect();

connection.query('SELECT * FROM users', (error, results, fields) => {
  if (error) throw error;
  console.log(results); // 输出乱码
});

connection.end();

La solution est de spécifier le format d'encodage correct lors de l'interrogation, comme par exemple. :

const mysql = require('mysql');

const connection = mysql.createConnection({
  host: 'localhost',
  user: 'root',
  password: 'password',
  database: 'test'
});

connection.connect();

connection.query('SELECT * FROM users', { charset: 'GBK' }, (error, results, fields) => {
  if (error) throw error;
  console.log(results); // 输出正确的文本
});

connection.end();

2. Problème de code tronqué Solution

  1. Utiliser Buffer

Dans Node.js, vous pouvez utiliser la classe Buffer pour gérer les données binaires, y compris la conversion du jeu de caractères. Utilisez la méthode Buffer.from() pour convertir une chaîne en données binaires avec un encodage spécifié et utilisez la méthode buf.toString() pour convertir des données binaires en une chaîne avec un encodage spécifié.

Par exemple, lorsque nous lisons un fichier texte codé en GBK, nous pouvons utiliser la classe Buffer pour résoudre le problème tronqué :

const fs = require('fs');

fs.readFile('file.txt', (err, data) => {
  if (err) throw err;
  const buf = Buffer.from(data, 'binary');
  console.log(buf.toString('GBK')); // 输出正确的文本
})
  1. Spécifier l'encodage des caractères

Dans Node.js, de nombreuses API fournissent des paramètres pour spécifier les caractères. encoding. , tel que { encoding: 'GBK' } lors de la lecture d'un fichier, charset=utf8 dans l'en-tête de réponse, { charset: 'GBK' } lors de l'interrogation de la base de données, etc. Une utilisation correcte de ces paramètres peut éviter des caractères tronqués.

Par exemple, lorsque nous utilisons le framework Express pour créer un serveur HTTP, nous pouvons spécifier l'encodage dans l'en-tête de réponse :

const express = require('express');
const app = express();

app.get('/', (req, res) => {
  res.set('Content-Type', 'text/html; charset=utf8');
  res.send('<html><body>中文</body></html>');
});

app.listen(8080, () => {
  console.log('Server started on http://localhost:8080/');
});
  1. Unifier l'encodage des caractères

Dans le serveur Node.js, unifier l'encodage des caractères peut évitez également les caractères tronqués. Nous pouvons définir le format d'encodage de toutes les chaînes sur UTF-8, ce qui peut éviter les caractères tronqués causés par un encodage incohérent.

Par exemple, on peut utiliser le module iconv-lite pour implémenter la conversion d'encodage :

const iconv = require('iconv-lite');

const buffer = iconv.encode('中文', 'GBK');
console.log(buffer); // <Buffer d6 d0 ce c4>

const str = iconv.decode(buffer, 'GBK');
console.log(str); // 中文

En bref, il est très courant de rencontrer des problèmes de code tronqué dans Node.js, mais à condition que la source du problème soit correctement identifiée et les solutions correspondantes sont prises, ces problèmes peuvent être facilement résolus.

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