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

Vue3 kapselt seine eigene Paging-Komponente

In diesem Artikelbeispiel wird der spezifische Co...

30 kostenlose hochwertige englische Ribbon-Schriftarten

30 kostenlose englische Ribbon-Schriftarten in hoh...

Zusammenfassung der Berechtigungsprobleme bei gespeicherten MySQL-Prozeduren

Ja, gespeicherte MySQL-Prozeduren scheinen sehr s...

Tutorial: Nginx-Reverse-Proxy-Konfiguration zum Entfernen von Präfixen

Wenn Sie nginx als Reverse-Proxy verwenden, könne...

Detaillierte Interpretation der Datei /etc/fstab im Linux-System

Vorwort [root@localhost ~]# cat /etc/fstab # # /e...

JavaScript-Entwurfsmuster, Befehlsmuster

Das Befehlsmuster ist ein Verhaltensentwurfsmuste...

Beispiel für die Anpassung von rem an mobile Geräte

Vorwort Überprüfung und Zusammenfassung von REM-A...