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

React-Prinzipien erklärt

Inhaltsverzeichnis 1. setState() Beschreibung 1.1...

Langsame MySQL-Abfrage: Langsame Abfrage aktivieren

1. Was nützt eine langsame Abfrage? Es kann alle ...

Windows 10 ist zu schwierig zu verwenden. Wie passen Sie Ihr Ubuntu an?

Autor | Herausgeber Awen | Produziert von Tu Min ...

So optimieren Sie MySQL-Indizes

1. Wie MySQL Indizes verwendet Indizes werden ver...

Docker-Umgebung in Linux-Umgebung installieren (keine Fallstricke)

Inhaltsverzeichnis Installationsvoraussetzungen S...

Beispielmethode zum Anzeigen von IP in Linux

Die Kenntnis der IP-Adresse eines Geräts ist wich...

Detaillierte Erklärung zum Anpassen des Linux-Befehlsverlaufs

Der Befehl „Bash History“ im Linux-System hilft d...

So installieren Sie Nginx in Docker

Installieren Sie Nginx auf Docker Nginx ist ein l...

Erfahren Sie mehr über die Verwendung regulärer Ausdrücke in JavaScript

Inhaltsverzeichnis 1. Was ist ein regulärer Ausdr...