nodejs masih bercelaru

WBOY
Lepaskan: 2023-05-13 19:05:35
asal
686 orang telah melayarinya

Node.js ialah persekitaran masa jalan JavaScript bahagian pelayan yang sangat popular. Ia mempunyai kelebihan ringan, cekap dan mudah dikembangkan. Ia digunakan secara meluas dalam aplikasi web, alat baris arahan, Internet of Things dan medan lain , tetapi dalam beberapa kes Dalam sesetengah kes, ia masih akan menghadapi beberapa masalah, seperti aksara bercelaru. Dalam artikel ini, kami akan meneroka punca dan penyelesaian kepada isu bercelaru Node.js.

1. Punca masalah kod bercelaru

  1. Pengekodan aksara tidak konsisten

Dalam Node.js, rentetan JavaScript menggunakan pengekodan UTF-8 secara lalai dalam beberapa kes, seperti membaca fail, meminta rangkaian dan operasi lain, rentetan yang dikembalikan tidak semestinya dikodkan UTF-8. Jika program tidak mengendalikan situasi ini dengan betul, aksara bercelaru mungkin mudah berlaku.

Sebagai contoh, apabila kita membaca fail teks yang dikodkan GBK, jika kita tidak menyatakan format pengekodan, adalah mudah untuk menemui aksara yang bercelaru:

const fs = require('fs');

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

Penyelesaiannya ialah membaca fail , Tentukan format pengekodan yang betul, seperti:

const fs = require('fs');

fs.readFile('file.txt', { encoding: 'GBK' }, (err, data) => {
  if (err) throw err;
  console.log(data.toString()); // 输出正确的文本
})
Salin selepas log masuk
  1. Pengepala respons tidak menyatakan set aksara

Dalam pelayan Node.js, apabila klien memulakan meminta dan mendapat respons, Pengepala respons perlu menentukan pengekodan aksara kandungan respons. Jika set aksara tidak dinyatakan dalam pengepala respons, atau set aksara yang ditentukan tidak konsisten dengan set aksara yang sebenarnya digunakan, aksara bercelaru akan berlaku.

Contohnya, kami menggunakan rangka kerja Express untuk mencipta pelayan HTTP Jika teks HTML yang dikembalikan tidak menyatakan pengekodan, adalah mudah untuk menghadapi masalah bercelaru:

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/');
});
Salin selepas log masuk

Penyelesaian adalah untuk. nyatakannya secara eksplisit dalam pengepala respons Set aksara kandungan respons, seperti:

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/');
});
Salin selepas log masuk
  1. Pengekodan pangkalan data tidak konsisten

Dalam Node.js, apabila berinteraksi dengan pangkalan data, kadangkala pengekodan pangkalan data dan pengekodan aksara tidak konsisten Node.js. Sebagai contoh, dalam pangkalan data MySQL, pengekodan aksara yang biasa digunakan ialah latin1 dan utf8, manakala pengekodan lalai Node.js ialah utf8 Jika kami tidak menyatakan pengekodan semasa membuat pertanyaan, aksara bercelaru mungkin berlaku.

Sebagai contoh, kami menggunakan modul mysql untuk menanyakan pangkalan data MySQL Jika pengekodan tidak dinyatakan, adalah mudah untuk menemui aksara yang bercelaru:

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();
Salin selepas log masuk

Penyelesaian adalah untuk menentukan pengekodan yang betul. format semasa membuat pertanyaan, seperti :

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();
Salin selepas log masuk

2 Penyelesaian kepada masalah kod bercelaru

  1. Gunakan Penampan

Dalam Node.js, anda boleh menggunakan. kelas Penampan untuk memproses data binari Termasuk penukaran set aksara. Gunakan kaedah Buffer.from() untuk menukar rentetan kepada data binari dengan pengekodan tertentu dan gunakan kaedah buf.toString() untuk menukar data binari kepada rentetan dengan pengekodan tertentu.

Sebagai contoh, apabila kita membaca fail teks yang dikodkan GBK, kita boleh menggunakan kelas Penampan untuk menangani masalah bercelaru:

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')); // 输出正确的文本
})
Salin selepas log masuk
  1. Tentukan pengekodan aksara

Dalam Node.js, banyak API menyediakan parameter untuk menentukan pengekodan aksara, seperti { pengekodan: 'GBK' } semasa membaca fail, charset=utf8 dalam pengepala respons dan { charset: 'GBK' } semasa membuat pertanyaan pangkalan data. Penggunaan parameter ini dengan betul boleh mengelakkan aksara bercelaru.

Sebagai contoh, apabila kami menggunakan rangka kerja Express untuk mencipta pelayan HTTP, kami boleh menentukan pengekodan dalam pengepala respons:

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/');
});
Salin selepas log masuk
  1. Satukan pengekodan aksara

dalam Dalam pelayan Node.js, penyatuan pengekodan aksara juga boleh mengelakkan aksara yang bercelaru. Kami boleh menetapkan format pengekodan semua rentetan kepada UTF-8, yang boleh mengelakkan aksara bercelaru yang disebabkan oleh pengekodan yang tidak konsisten.

Sebagai contoh, kita boleh menggunakan modul iconv-lite untuk melaksanakan penukaran pengekodan:

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); // 中文
Salin selepas log masuk

Ringkasnya, adalah perkara biasa untuk menemui aksara bercelaru dalam Node.js, tetapi selagi punca masalah dikenal pasti dengan betul, masalah ini boleh diselesaikan dengan mudah dengan menggunakan penyelesaian yang sepadan.

Atas ialah kandungan terperinci nodejs masih bercelaru. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan