Rumah > Artikel > hujung hadapan web > nodejs masih bercelaru
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
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()); // 输出乱码 })
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()); // 输出正确的文本 })
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/'); });
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/'); });
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();
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();
2 Penyelesaian kepada masalah kod bercelaru
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')); // 输出正确的文本 })
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/'); });
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); // 中文
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!