So verwenden Sie js, um festzustellen, ob eine Datei UTF-8-codiert ist

So verwenden Sie js, um festzustellen, ob eine Datei UTF-8-codiert ist

Konventionelle Lösung

Verwenden Sie FileReader, um die Datei im UTF-8-Format zu lesen, und bestimmen Sie, ob die Datei UTF-8 ist, basierend darauf, ob der Dateiinhalt verstümmelte Zeichen enthält.

Wenn � vorhanden ist, ist die Dateikodierung nicht UTF-8, andernfalls ist es UTF-8.

Der Code lautet wie folgt:

const isUtf8 = async (Datei: Datei) => {
  returniere und warte auf neues Promise((lösen, ablehnen) => {
    Konstante Leser = neuer FileReader();
    reader.readAsText(Datei);

    reader.onloadend = (e: beliebig): void => {
      const Inhalt = e.Ziel.Ergebnis;
      const encodingRight = content.indexOf("") === -1;

      wenn (KodierungRechts) {
        auflösen(Kodierungsrechts);
      } anders {
        reject(new Error("Fehler im Kodierungsformat, bitte laden Sie eine Datei im UTF-8-Format hoch"));
      }
    };
    
    reader.onerror = () => {
      reject(new Error("Das Lesen des Dateiinhalts ist fehlgeschlagen, bitte prüfen Sie, ob die Datei beschädigt ist"));
    };
  });
};

Das Problem bei dieser Methode besteht darin, dass bei sehr großen Dateien, z. B. mehreren GB, der vom Browser gelesene Inhalt direkt im Speicher abgelegt wird und die Instanz von fileReader direkt „onerror“ auslöst und einen Fehler ausgibt, wodurch der Browser manchmal direkt abstürzt.

Lösung für große Dateien

Bei großen Dateien können Sie den Dateiinhalt abtasten und die Datei in Slices aufteilen. Hier werden 100 Slices verwendet. Schneiden Sie für jede ausgeschnittene Datei das erste 1-KB-Segment aus und lesen Sie es im String-Modus. Wenn 1024B genau in der Mitte einer chinesischen Zeichenkodierung abgeschnitten wird, kann dies beim Lesen als Zeichenfolge zu einem Fehler führen, d. h., „�“ kann am Anfang und am Ende erscheinen und wird als Nicht-UTF-8-Segment betrachtet. Zu diesem Zeitpunkt können Sie die erste Hälfte der Zeichenfolge nehmen, die 1 KB entspricht, und dann feststellen, ob sie vorhanden ist.

Die oben genannten Konstanten können je nach Bedarf angepasst werden.

Der Code lautet wie folgt:

const getSamples = (Datei: Datei) => {
  const filesize = Dateigröße;
  Konstante Teile: Blob[] = [];
  if (Dateigröße < 50 * 1024 * 1024) {
    teile.push(Datei);
  } anders {
    sei gesamt = 100;
    const Stichprobengröße = 1024 * 1024;
    const chunkSize = Math.floor(Dateigröße / Gesamt);
    lass start = 0;
    let end = Beispielgröße;
    während (Gesamt > 1) {
      Teile.push(Datei.Slice(Start, Ende));
      Start += Blockgröße;
      Ende += Blockgröße;
      gesamt--;
    }
  }
  Rücksendeteile;
};

const isUtf8 = (Dateiteil: Blob) => {
  returniere neues Promise((lösen, ablehnen) => {
    const fileReader = neuer FileReader();

    fileReader.readAsText(Dateiteil);

    fileReader.onload = (e) => {
      const str = e.Ziel?.Ergebnis als Zeichenfolge;
      // Nimm ungefähr die Hälfte const sampleStr = str?.slice(4, 4 + str?.length / 2);
      wenn (sampleStr.indexOf("�") === -1) {
        auflösen (void 0);
      } anders {
        reject(neuer Fehler (Fehler im Kodierungsformat, bitte laden Sie eine Datei im UTF-8-Format hoch));
      }
    };

    fileReader.onerror = () => {
      reject(new Error(Lesen des Dateiinhalts fehlgeschlagen, bitte prüfen Sie, ob die Datei beschädigt ist"));
    };
  });
};

exportiere standardmäßige asynchrone Funktion (Datei: Datei) {
  const samples = getSamples(Datei);
  lass res = true;

  für (const Dateiteil von Beispielen) {
    versuchen {
      warte auf isUtf8(filePart);
    } Fehler abfangen {
      res = falsch;
      brechen;
    }
  }
  Rückgabewert;
}

Dies ist das Ende dieses Artikels darüber, wie js bestimmt, ob eine Datei in UTF-8 codiert ist. Weitere relevante Inhalte zur Beurteilung von UTF-8 durch js finden Sie in den vorherigen Artikeln von 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • PHP bestimmt, ob die Zeichenfolgenkodierung UTF-8 oder GB2312 ist. Beispiel
  • PHP-regulärer Ausdruck zur Beurteilung von chinesischem UTF-8 oder GBK und seiner spezifischen Implementierung

<<:  mysql5.6.zip-Format komprimierte Version Installations-Grafik-Tutorial

>>:  Eine Fehlerbehebungserfahrung im CentOS-Docker-Bridge-Modus, bei dem auf den Host-Redis-Dienst nicht zugegriffen werden kann

Artikel empfehlen

Was ist Software 404 und 404-Fehler und was ist der Unterschied zwischen ihnen

Zunächst einmal: Was ist 404 und Soft 404? 404: Ei...

MySQL-Fremdschlüsseleinschränkung (FOREIGN KEY) Fallerklärung

Die MySQL-Fremdschlüsseleinschränkung (FOREIGN KE...

MySQL-Abfrageoptimierung: Eine Tabellenoptimierungslösung für 1 Million Daten

1. Abfragegeschwindigkeit von zwei Abfrage-Engine...

So beenden Sie den MySQL-Prozess ordnungsgemäß und sicher

Vorwort In diesem Artikel wird der Vorgang zum He...

Detaillierte Schritte zum Debuggen von VUE-Projekten in IDEA

Um JS-Code zu debuggen, müssen Sie jedes Mal eine...

Was ist Makefile in Linux? Wie funktioniert es?

Führen Sie Ihre Programme mit diesem praktischen ...

Docker-Image erstellen Dockerfile und Commit-Operationen

Erstellen des Images Es gibt zwei Hauptmethoden z...

Spezifische Verwendung des Vollbild-Scrollens von fullpage.js

1.fullpage.js Download-Adresse https://github.com...

Vue-Ereignisparameter $event = Ereigniswertfall

Vorlage <el-table :data="Datenliste"...

MySQL-Datenbank-Grundlagen SQL-Fensterfunktion Beispielanalyse-Tutorial

Inhaltsverzeichnis Einführung Einführung Aggregat...

So installieren Sie den MySQL 5.7.28-Binärmodus unter CentOS 7.4

Linux-Systemversion: CentOS7.4 MySQL-Version: 5.7...