Node.js は、非常に人気のあるサーバーサイド JavaScript ランタイム環境です。軽量で効率的で、拡張が容易であるという利点があります。Web アプリケーション、コマンド ライン ツール、モノのインターネットなどの分野で広く使用されています。 , ただし、場合によっては文字化けなどの問題が発生する場合もあります。この記事では、Node.js の文字化け問題の原因と解決策を探っていきます。
1. コード文字化けの問題の理由
Node.js では、JavaScript 文字列はデフォルトで UTF-8 エンコーディングを使用します。ただし、ファイルの読み取り、ネットワークのリクエスト、その他の操作など、場合によっては、返される文字列が必ずしも UTF-8 エンコードされているとは限りません。この状況をプログラムが正しく処理しないと、文字化けが発生しやすくなります。
たとえば、GBK でエンコードされたテキスト ファイルを読み取るときに、エンコード形式を指定しないと、コードの文字化けの問題が発生しやすくなります。
const fs = require('fs'); fs.readFile('file.txt', (err, data) => { if (err) throw err; console.log(data.toString()); // 输出乱码 })
解決策は、ファイルには、次のような正しいエンコード形式を指定します。
const fs = require('fs'); fs.readFile('file.txt', { encoding: 'GBK' }, (err, data) => { if (err) throw err; console.log(data.toString()); // 输出正确的文本 })
Node.js サーバーでは、クライアントが開始するときにリクエストを送信してレスポンスを取得する場合、レスポンスヘッダーにはレスポンス内容の文字エンコーディングを指定する必要があります。レスポンスヘッダに文字セットが指定されていない場合や、指定した文字セットと実際に使用する文字セットが一致していない場合は文字化けが発生します。
たとえば、Express フレームワークを使用して HTTP サーバーを作成します。返された HTML テキストでエンコーディングが指定されていない場合、文字化けの問題が発生しやすくなります。
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/'); });
解決策は次のとおりです。応答ヘッダーで明確に指定します。 応答コンテンツの文字セット。例:
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/'); });
Node.js でデータベースと対話するとき、場合によっては、データベースのエンコーディングと Node.js の文字エンコーディングが一致しないと表示されることがあります。たとえば、MySQL データベースでは一般的に使用される文字エンコーディングは latin1 と utf8 ですが、Node.js のデフォルトのエンコーディングは utf8 であるため、クエリ時にエンコーディングを指定しないと文字化けが発生する可能性があります。
たとえば、mysql モジュールを使用して MySQL データベースにクエリを実行します。エンコーディングが指定されていない場合、コードの文字化けの問題が発生しやすくなります。
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();
解決策は、正しいエンコーディングを指定することです。クエリ時のエンコード形式 (例:
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) コード文字化けの問題の解決策
Node.js では、次のことができます。 Buffer クラスを使用してバイナリ データを処理します。文字セット変換も含まれます。 Buffer.from() メソッドを使用して文字列を指定したエンコーディングのバイナリ データに変換し、buf.toString() メソッドを使用してバイナリ データを指定したエンコーディングの文字列に変換します。
たとえば、GBK でエンコードされたテキスト ファイルを読み取る場合、Buffer クラスを使用して文字化けの問題に対処できます。
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')); // 输出正确的文本 })
Node.js では、多くの API が文字エンコーディングを指定するためのパラメーターを提供します。たとえば、ファイル読み取り時の {coding: 'GBK' }、応答ヘッダーの charset=utf8、クエリ時の { charset: 'GBK' } などです。データベース。待ってください。これらのパラメータを正しく使用すると、文字化けを回避できます。
たとえば、Express フレームワークを使用して HTTP サーバーを作成する場合、応答ヘッダーでエンコーディングを指定できます。
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/'); });
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); // 中文
以上がNodejsはまだ文字化けしていますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。