MIMEエンコーディングを再帰的に変換する方法(us-asciiからutf-8へ)

MIMEエンコーディングを再帰的に変換する方法(us-asciiからutf-8へ)

us-asciiエンコードファイルはほとんどありません。私はそれらを再帰的に変換したいと思いますutf-8

コマンドを使用しているファイルを見つけるには

find . -name "*.adoc" -type f -exec file --mime-encoding {} \; | grep -v ": us-ascii"

出力は次のとおりです。

./sds.adoc: us-ascii
./docker/misc/terms.adoc: us-ascii
./docker/misc/tools.adoc: us-ascii
./docker/basics-containers.adoc: us-ascii
./web-scraping/links.adoc: us-ascii
./system-design/reference-architecture.adoc: us-ascii
./system-design/replication vs load balancing.adoc: us-ascii
./system-design/performance.adoc: us-ascii
./system-design/links.adoc: us-ascii
./system-design/disaster-recovery.adoc: us-ascii

変換するには使用する必要があると思います。iconv -f us-ascii file.adoc -t UTF-8 -o file.adoc

どうすればいいのかわかりません。

答え1

US-ASCII は UTF-8 のサブセットです。 US-ASCIIはU + 0000からU + 007Fまでの文字のみを扱い、これらの文字のエンコーディングはUS-ASCIIからUTF-8と同じです(バイト値はUnicodeコードポイントに対応します(Uのバイト値はバイト0x41 )+ 0041文字(A例:))。

だからあなたができることは何もありません。ファイルはすでにUTF-8形式です。

fileus-asciiを報告する理由は、見た小さなサブセットでテキストのように見え、0x7fより大きいバイト値がなく、おそらく使用された文字分布が他の7ビット文字セット(EBCDICなど)よりも小さいためです。 ASCIIの可能性が高いです。

これらを実行するのはiconv -f us-ascii -t UTF-8せいぜい何もせず、最悪の場合何か間違っfileていて0x7fより高いバイト値があるためデータを失うので非生産的です(UTF-8またはU+007Fより高い他のエンコーディング文字設定の文字について) 。 ) 見ていない部分はiconvエラーにより中断され、不完全なファイルが残ります。


1推測として、通常は信頼性の高い決定できないテキストファイルの文字セットを推測するためにどのような経験的方法を使用しているかを確認するには、libmagicコードを調べる必要があります。

答え2

次のようにしてみてください。

find . -name '*.adoc' -type f -execdir sh -c '
  for f; do
    file --mime-encoding "$f" | grep -qi us-ascii &&
      bn="$(basename "$f" .adoc)" && 
      iconv -f us-ascii "$f" -t UTF-8 -o "$bn-utf8.adoc"
  done' sh {} +

これはファイルを含むcdすべてのディレクトリに移動し、そのディレクトリ内のすべての.adocファイルに対してファイルがus-asciiとマークされている場合は、それを使用して別の出力ファイル名を使用してutf-8に変換します。 。.adocfileiconv

注:この-execdirオプションは非標準であり、GNUまたはBSDバージョンが必要ですfind。 GNUはLinuxの標準です。


元のus-asciiファイルをutf-8バージョンに置き換えるには、この&&行の終わりiconvとその直後に次の行を追加します。

  mv "$bn-utf8.adoc" "$f"

関連情報