Nodejsはまだ文字化けしています

WBOY
リリース: 2023-05-13 19:05:35
オリジナル
654 人が閲覧しました

Node.js は、非常に人気のあるサーバーサイド JavaScript ランタイム環境です。軽量で効率的で、拡張が容易であるという利点があります。Web アプリケーション、コマンド ライン ツール、モノのインターネットなどの分野で広く使用されています。 , ただし、場合によっては文字化けなどの問題が発生する場合もあります。この記事では、Node.js の文字化け問題の原因と解決策を探っていきます。

1. コード文字化けの問題の理由

  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()); // 输出正确的文本
})
ログイン後にコピー
  1. 応答ヘッダーには文字セットが指定されていません

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/');
});
ログイン後にコピー
  1. 一貫性のないデータベース エンコーディング

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) コード文字化けの問題の解決策

  1. Use Buffer

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')); // 输出正确的文本
})
ログイン後にコピー
  1. 文字エンコードを指定します

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/');
});
ログイン後にコピー
    #文字エンコーディングを統一する
Node.js サーバーでは、文字エンコーディングを統一することで文字化けを回避することもできます。すべての文字列のエンコード形式を UTF-8 に設定できるため、エンコードの不一致による文字化けを回避できます。

たとえば、iconv-lite モジュールを使用してエンコード変換を実装できます。

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); // 中文
ログイン後にコピー
つまり、Node.js でコード化けの問題が発生するのは非常に一般的ですが、問題の原因が正しく特定されていれば、対応する解決策を採用することでこれらの問題を簡単に解決できます。

以上がNodejsはまだ文字化けしていますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート