js を使用してファイルが UTF-8 でエンコードされているかどうかを判断する方法

js を使用してファイルが UTF-8 でエンコードされているかどうかを判断する方法

従来の解決策

FileReader を使用して UTF-8 形式のファイルを読み取り、ファイルの内容に文字化けした文字が含まれているかどうかに基づいて、ファイルが UTF-8 かどうかを判断します。

� が存在する場合、ファイルのエンコーディングは utf-8 ではありません。それ以外の場合は utf-8 です。

コードは次のとおりです。

const isUtf8 = async (ファイル: ファイル) => {
  戻り、新しい Promise((resolve, reject) => { を待ちます。
    const リーダー = 新しい FileReader();
    reader.readAsText(ファイル);

    reader.onloadend = (e: 任意): void => {
      定数コンテンツ = e.target.result;
      const encodingRight = content.indexOf("") === -1;

      if (encodingRight) {
        解決(エンコーディング右);
      } それ以外 {
        拒否(新しいエラー("エンコード形式エラーです。UTF-8形式のファイルをアップロードしてください"));
      }
    };
    
    リーダー.onerror = () => {
      拒否(新しいエラー("ファイルの内容の読み取りに失敗しました。ファイルが破損していないか確認してください"));
    };
  });
};

この方法の問題点は、ファイルが数 GB など非常に大きい場合、ブラウザが読み取ったコンテンツが直接メモリに配置され、fileReader インスタンスが直接 onerror をトリガーしてエラーをスローし、場合によってはブラウザが直接クラッシュすることです。

大容量ファイルソリューション

大きなファイルの場合は、ファイルの内容をサンプリングしてファイルをスライスすることができます。ここでは、100 個のスライスが使用されています。切り取ったファイルごとに、最初の 1kb セグメントを切り取り、文字列モードで読み取ります。 1024B が中国語文字エンコードの真ん中でカットされると、文字列として読み取るときにエラーが発生する可能性があります。つまり、� が先頭と末尾に出現し、非 UTF-8 セグメントとみなされる可能性があります。このとき、1kb に対応する文字列の前半部分を取得して、それが存在するかどうかを判断できます。

上記の定数は要件に応じて調整できます。

コードは次のとおりです。

const getSamples = (ファイル: ファイル) => {
  定数ファイルサイズ = ファイル.サイズ;
  定数パーツ: Blob[] = [];
  ファイルサイズが 50 * 1024 * 1024 未満の場合
    parts.push(ファイル);
  } それ以外 {
    合計を 100 とします。
    定数サンプルサイズ = 1024 * 1024;
    const chunkSize = Math.floor(ファイルサイズ / 合計);
    開始 = 0 とします。
    end = sampleSize; とします。
    (合計>1)の間{
      parts.push(file.slice(start, end));
      開始 += チャンクサイズ;
      終了 += チャンクサイズ;
      合計 - ;
    }
  }
  部品を返品する。
};

const isUtf8 = (ファイルパート: Blob) => {
  新しい Promise を返します ((resolve, reject) => {
    新しいFileReader()を作成します。

    fileReader.readAsText(ファイルパート);

    ファイルリーダー.onload = (e) => {
      const str = e.target?.result を文字列として返します。
      // およそ半分を取る const sampleStr = str?.slice(4, 4 + str?.length / 2);
      (sampleStr.indexOf("�") === -1)の場合{
        解決(void 0);
      } それ以外 {
        拒否(新しいエラー(エンコード形式エラー、UTF-8形式のファイルをアップロードしてください"));
      }
    };

    ファイルリーダー.onerror = () => {
      拒否(新しいエラー(ファイルの内容の読み取りに失敗しました。ファイルが破損していないか確認してください"));
    };
  });
};

デフォルトの非同期関数をエクスポートします(ファイル:File){
  const サンプル = getSamples(ファイル);
  res = true とします。

  for (const サンプルのファイル部分) {
    試す {
      isUtf8(filePart) を待機します。
    } キャッチ(エラー){
      戻り値:
      壊す;
    }
  }
  res を返します。
}

ファイルが utf-8 でエンコードされているかどうかを js がどのように判断するかについてのこの記事はこれで終わりです。より関連性の高い js 判断 utf-8 コンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • PHP は文字列のエンコーディングが utf-8 か gb2312 かを判定します。例
  • 中国語UTF-8かGBKかを判断するPHP正規表現とその具体的な実装

<<:  mysql5.6.zip形式の圧縮版インストールグラフィックチュートリアル

>>:  Centos Docker ブリッジ モードでホスト Redis サービスにアクセスできないというトラブルシューティングの経験

推薦する

Linuxのwhichコマンドの具体的な使い方

Linux でファイルを見つけたいのに、その場所がわからないことがよくあります。次のコマンドを使用し...

MySQL シリーズ: redo ログ、undo ログ、binlog の詳細な説明

取引の実施REDO ログはトランザクションの永続性を保証し、UNDO ログはトランザクションのロール...

Dockerカスタムネットワークコンテナ相互接続

目次序文-リンクカスタムネットワーク質問する序文前回は、 -Linkパラメータを使用してコンテナ間の...

jsはシンプルなカウントダウンを実装します

この記事の例では、参考までに簡単なカウントダウンを実装するためのjsの具体的なコードを共有しています...

自動的にフォーカスを取得する要素入力ボックスの実装

最近のプロジェクトでフォームを作成するときに、コメント ボックスまで自動的にスクロールし、コメント ...

Linux gzipコマンドの使用

1. コマンドの紹介gzip (GNU zip) コマンドは、ファイルの圧縮と解凍に使用されます。こ...

Linux でのマルチスレッドにおけるフォークの紹介

目次質問:ケース(1)子スレッドを作成する前にフォークするケース(2)子スレッドを作成した後にフォー...

レスポンシブ原則と Vue2.0/3.0 の違いについての簡単な分析

序文vue3.0 が正式にリリースされて以来、多くの友人が vue3.0 に切り替えました。ここでは...

React Fiberの仕組みの詳細な説明

目次React Fiberとは何ですか?なぜReact Fiberなのか? React Fiberは...

MySQL データ型の選択原則

目次小さいけれど美しいシンプルにNULL値を避けるデータタイプを選択する手順データ型の紹介1. 文字...

MySQL でよく使われる型変換関数の概要 (推奨)

1. Concat関数。よく使用される接続文字列: concat 関数。たとえば、SQLクエリ条件...

MySQL FAQ シリーズ: ibdata1 ファイルのサイズが突然増加しないようにする方法

0. はじめにibdata1 ファイルとは何ですか? ibdata1 は、innodb システム テ...

MySQLの高可用性と高パフォーマンスのクラスタを構築する方法

目次MySQL NDB Clusterとはクラスター構築のための準備作業クラスターのデプロイを開始す...

あまり使われていない、または誤解されている HTML タグ 10 個

ここでは、あまり使われていない、または誤解されている 10 個の HTML タグを紹介します。あまり...

Docker で FastDFS ファイル システムを構築する (マルチイメージ チュートリアル)

目次FastDFSについて1. 画像を検索する2. イメージをインストールする3.1. 必要なディレ...