Heim >Web-Frontend >Front-End-Fragen und Antworten >nodejs ist immer noch verstümmelt

nodejs ist immer noch verstümmelt

WBOY
WBOYOriginal
2023-05-13 19:05:35689Durchsuche

Node.js ist eine sehr beliebte serverseitige JavaScript-Laufzeitumgebung. Sie hat den Vorteil, dass sie leichtgewichtig, effizient und einfach zu erweitern ist. Sie wird häufig in Webanwendungen, Befehlszeilentools, dem Internet der Dinge und anderen Bereichen verwendet In einigen Fällen treten weiterhin Probleme auf, z. B. verstümmelte Zeichen. In diesem Artikel werden wir die Ursachen und Lösungen für verstümmelte Node.j-Probleme untersuchen.

1. Die Ursache für das Problem mit verstümmeltem Code

  1. Inkonsistente Zeichenkodierung

In Node.js verwenden JavaScript-Zeichenfolgen standardmäßig die UTF-8-Kodierung, in einigen Fällen jedoch, z. B. beim Lesen von Dateien, beim Anfordern des Netzwerks usw Operationen, Rückgabe Die Zeichenfolge ist nicht unbedingt UTF-8-codiert. Wenn das Programm mit dieser Situation nicht richtig umgeht, kann es leicht zu verstümmelten Zeichen kommen.

Wenn wir beispielsweise eine GBK-codierte Textdatei lesen und das Codierungsformat nicht angeben, stoßen wir leicht auf verstümmelte Zeichen:

const fs = require('fs');

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

Die Lösung besteht darin, beim Lesen der Datei das richtige Codierungsformat anzugeben, z :

const fs = require('fs');

fs.readFile('file.txt', { encoding: 'GBK' }, (err, data) => {
  if (err) throw err;
  console.log(data.toString()); // 输出正确的文本
})
  1. Der Antwortheader gibt keinen Zeichensatz an

Wenn der Client auf dem Node.js-Server eine Anfrage initiiert und eine Antwort erhält, muss die Zeichenkodierung des Antwortinhalts im Antwortheader angegeben werden . Wenn der Zeichensatz im Antwortheader nicht angegeben ist oder der angegebene Zeichensatz nicht mit dem tatsächlich verwendeten Zeichensatz übereinstimmt, treten verstümmelte Zeichen auf.

Zum Beispiel verwenden wir das Express-Framework, um einen HTTP-Server zu erstellen. Wenn der zurückgegebene HTML-Text die Codierung nicht angibt, kann es leicht zu verstümmelten Zeichen kommen:

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/');
});

Die Lösung besteht darin, den Zeichensatz der Antwort klar anzugeben Inhalt im Antwortheader, wie zum Beispiel:

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. Inkonsistente Datenbankkodierung

In Node.js stimmt bei der Interaktion mit der Datenbank manchmal die Datenbankkodierung nicht mit der Zeichenkodierung von Node.js überein. In der MySQL-Datenbank sind beispielsweise die häufig verwendeten Zeichenkodierungen latin1 und utf8, während die Standardkodierung von Node.js utf8 ist. Wenn wir die Kodierung bei der Abfrage nicht angeben, können verstümmelte Zeichen auftreten.

Zum Beispiel verwenden wir das MySQL-Modul, um die MySQL-Datenbank abzufragen. Wenn die Codierung nicht angegeben ist, kann leicht das Problem des verstümmelten Codes auftreten:

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();

Die Lösung besteht darin, beim Abfragen das richtige Codierungsformat anzugeben, z :

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. Lösung für das Problem mit verstümmeltem Code

  1. Verwenden Sie Buffer

In Node.js können Sie die Buffer-Klasse verwenden, um Binärdaten zu verarbeiten, einschließlich der Zeichensatzkonvertierung. Verwenden Sie die Methode Buffer.from(), um eine Zeichenfolge in Binärdaten mit einer angegebenen Kodierung umzuwandeln, und verwenden Sie die Methode buf.toString(), um Binärdaten in eine Zeichenfolge mit einer angegebenen Kodierung umzuwandeln.

Wenn wir beispielsweise eine GBK-codierte Textdatei lesen, können wir die Buffer-Klasse verwenden, um das verstümmelte Problem zu lösen:

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. Zeichenkodierung angeben

In Node.js stellen viele APIs Parameter zum Angeben von Zeichen bereit Kodierung, z. B. { Kodierung: 'GBK' } beim Lesen einer Datei, charset=utf8 im Antwortheader, { charset: 'GBK' } beim Abfragen der Datenbank usw. Durch die korrekte Verwendung dieser Parameter können verstümmelte Zeichen vermieden werden.

Wenn wir beispielsweise das Express-Framework zum Erstellen eines HTTP-Servers verwenden, können wir die Kodierung im Antwortheader angeben:

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. Vereinheitlichen Sie die Zeichenkodierung

Auf dem Node.js-Server kann die Zeichenkodierung vereinheitlicht werden Vermeiden Sie außerdem verstümmelte Zeichen. Wir können das Codierungsformat aller Zeichenfolgen auf UTF-8 festlegen, wodurch verstümmelte Zeichen durch inkonsistente Codierung vermieden werden können.

Zum Beispiel können wir das Modul iconv-lite verwenden, um die Kodierungskonvertierung zu implementieren:

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); // 中文

Kurz gesagt, es kommt sehr häufig vor, dass in Node.js Probleme mit verstümmeltem Code auftreten, solange die Ursache des Problems korrekt identifiziert wird Wenn entsprechende Lösungen gefunden werden, können diese Probleme leicht gelöst werden.

Das obige ist der detaillierte Inhalt vonnodejs ist immer noch verstümmelt. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn