Heim  >  Artikel  >  Web-Frontend  >  Verwenden Sie Node.js, um Codierungsprobleme des Front-End-Codes files_node.js zu lösen

Verwenden Sie Node.js, um Codierungsprobleme des Front-End-Codes files_node.js zu lösen

WBOY
WBOYOriginal
2016-05-16 15:15:141578Durchsuche

Bei der Verwendung von NodeJS zum Schreiben von Front-End-Tools handelt es sich bei den am häufigsten verwendeten Textdateien um Textdateien, sodass auch das Problem der Dateikodierung eine Rolle spielt. Unsere am häufigsten verwendeten Textkodierungen sind UTF8 und GBK, und UTF8-Dateien können auch BOM enthalten. Beim Lesen von Textdateien mit unterschiedlichen Codierungen muss der Dateiinhalt in die von JS verwendete UTF8-codierte Zeichenfolge konvertiert werden, bevor er normal verarbeitet werden kann.

Stücklistenentfernung
BOM wird verwendet, um eine Textdatei mit Unicode-Kodierung zu kennzeichnen, bei der es sich selbst um ein Unicode-Zeichen („uFEFF“) im Header der Textdatei handelt. Unter verschiedenen Unicode-Codierungen lauten die Binärbytes, die den Stücklistenzeichen entsprechen, wie folgt:

  Bytes   Encoding
----------------------------
  FE FF    UTF16BE
  FF FE    UTF16LE
  EF BB BF  UTF8

Daher können wir anhand der ersten paar Bytes der Textdatei bestimmen, ob die Datei eine Stückliste enthält und welche Unicode-Codierung verwendet werden soll. Obwohl das BOM-Zeichen bei der Kennzeichnung der Dateikodierung eine Rolle spielt, ist es nicht Teil des Dateiinhalts. Wenn das BOM beim Lesen der Textdatei nicht entfernt wird, kann es in bestimmten Verwendungsszenarien zu Problemen kommen. Wenn wir beispielsweise mehrere JS-Dateien in einer Datei zusammenführen und die Datei Stücklistenzeichen enthält, führt dies zu Browser-JS-Syntaxfehlern. Wenn Sie NodeJS zum Lesen von Textdateien verwenden, müssen Sie daher im Allgemeinen die Stückliste entfernen. Der folgende Code implementiert beispielsweise die Funktion zum Identifizieren und Entfernen von UTF8-Stücklisten.

function readText(pathname) {
  var bin = fs.readFileSync(pathname);

  if (bin[0] === 0xEF && bin[1] === 0xBB && bin[2] === 0xBF) {
    bin = bin.slice(3);
  }

  return bin.toString('utf-8');
}

GBK zu UTF8
NodeJS unterstützt die Angabe der Textkodierung beim Lesen einer Textdatei oder beim Konvertieren eines Puffers in einen String, aber leider liegt die GBK-Kodierung nicht im Rahmen der eigenen Unterstützung von NodeJS. Daher verwenden wir im Allgemeinen das Drittanbieterpaket iconv-lite, um die Kodierung zu konvertieren. Nachdem wir das Paket mit NPM heruntergeladen haben, können wir wie folgt eine Funktion schreiben, um die GBK-Textdatei zu lesen.

var iconv = require('iconv-lite');

function readGBKText(pathname) {
  var bin = fs.readFileSync(pathname);

  return iconv.decode(bin, 'gbk');
}

Einzelbyte-Kodierung
Manchmal können wir nicht vorhersagen, welche Kodierung die Datei verwendet, die wir lesen müssen, und können daher nicht die richtige Kodierung angeben. Beispielsweise sind einige der CSS-Dateien, die wir verarbeiten müssen, in GBK und andere in UTF8 codiert. Obwohl es bis zu einem gewissen Grad möglich ist, die Textkodierung anhand des Byteinhalts der Datei zu erraten, stelle ich hier eine etwas eingeschränkte, aber viel einfachere Technik vor.

Zuallererst wissen wir, dass, wenn eine Textdatei nur englische Zeichen wie „Hello World“ enthält, das Lesen der Datei mit GBK- oder UTF8-Kodierung problemlos möglich ist. Dies liegt daran, dass bei diesen Codierungen Zeichen im Bereich von ASCII0 bis 128 dieselbe Einzelbyte-Codierung verwenden.

Selbst wenn eine Textdatei chinesische und andere Zeichen enthält, können wir dies tun, wenn die Zeichen, die wir verarbeiten müssen, nur im Bereich von ASCII0 bis 128 liegen, z. B. andere JS-Codes als Kommentare und Zeichenfolgen Verwenden Sie die Einzelbyte-Kodierung einheitlich, um die Datei zu lesen. Es ist nicht erforderlich, sich darum zu kümmern, ob die tatsächliche Kodierung der Datei GBK oder UTF8 ist. Das folgende Beispiel veranschaulicht diesen Ansatz.

1. GBK-Codierungsquelldateiinhalt:

  var foo = '中文';

2. Entsprechendes Byte:

  76 61 72 20 66 6F 6F 20 3D 20 27 D6 D0 CE C4 27 3B

3. Der nach dem Lesen mit Einzelbyte-Codierung erhaltene Inhalt:

  var foo = '{乱码}{乱码}{乱码}{乱码}';

4. Ersatzinhalt:

  var bar = '{乱码}{乱码}{乱码}{乱码}';

5. Die entsprechenden Bytes nach dem Speichern mit Einzelbyte-Kodierung:

  76 61 72 20 62 61 72 20 3D 20 27 D6 D0 CE C4 27 3B

6. Verwenden Sie die GBK-Codierung, um den Inhalt zu lesen und abzurufen:

  var bar = '中文';

Der Trick hierbei besteht darin, dass unabhängig davon, in welche verstümmelten Zeichen ein einzelnes Byte größer als 0xEF unter der Einzelbyte-Kodierung geparst wird, die entsprechenden Bytes dahinter unverändert bleiben, wenn diese verstümmelten Zeichen mit derselben Einzelbyte-Kodierung gespeichert werden.

NodeJS verfügt über eine Binärkodierung, die zur Implementierung dieser Methode verwendet werden kann. Im folgenden Beispiel verwenden wir diese Kodierung, um zu demonstrieren, wie der dem obigen Beispiel entsprechende Code geschrieben wird.

function replace(pathname) {
  var str = fs.readFileSync(pathname, 'binary');
  str = str.replace('foo', 'bar');
  fs.writeFileSync(pathname, str, 'binary');
}

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