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

Die große Rolle von HTML-Meta

Es gibt zwei Metaattribute: Name und http-equiv. D...

Häufig gestellte Fragen zu Docker

Docker ordnet Ports nur IPv6 zu, nicht aber IPv4 ...

Beheben Sie den abnormalen Fehler beim Erstellen einer Vue-Umgebung mit Webpack

Inhaltsverzeichnis Konfigurieren Sie zuerst packa...

Ein kurzer Überblick über CSS3-Pseudoklassenselektoren

Vorwort Wenn CSS die Grundfertigkeit der Front-En...

Verwendung des Fokus-innerhalb-Selektors von CSS3

Pseudoelemente und Pseudoklassen Apropos, schauen...

Detaillierte Erklärung des HTML-Bereichs-Tags

Der <area>-Tag definiert einen Bereich in e...

Modularität in Node.js, npm-Paketmanager erklärt

Inhaltsverzeichnis Das Grundkonzept der Modularit...

Spezielle Methode zum Hinzufügen von Fremdschlüsseleinschränkungen in MySQL

Die Betriebsumgebung dieses Tutorials: Windows 7-...

Details zu den Überwachungseigenschaften der Uhr in Vue

Inhaltsverzeichnis 1.watch überwacht Änderungen i...

Detaillierte Erklärung der allgemeinen For-Schleife in JavaScript-Anweisungen

Es gibt viele Schleifenanweisungen in JavaScript,...

Detaillierte Erklärung zur Überwachung von MySQL-Anweisungen

Schnelles Lesen Warum müssen wir SQL-Anweisungen ...

Schritte zur Erstellung einer React Fiber-Struktur

Inhaltsverzeichnis React-Fasererstellung 1. Bevor...

Eine schnelle Lösung für das Problem der PC- und Mobilanpassung

Beim Erstellen einer Webseite müssen wir normaler...