ASCII でエンコードされたファイルが UTF-8 に拡張されたり、逆に ASCII に縮小されたりするのはなぜですか?
user:~$ echo 'A B C | } ~' > ./file
user:~$
user:~$ file --brief --mime ./file
text/plain; charset=us-ascii
user:~$
user:~$
user:~$ echo 'ᴁ ♫ ⼌
答え1
「エンコーディング」と「文字セット」を混同していると思います。
最初のケースでは、ファイルには US-ASCII の文字のみが含まれます。つまり、表示に使用している言語設定に関係なく、ファイルは同じように表示されます。
2 番目のケースでは、ファイルに UTF8 文字セットに属する文字が含まれるようになります。これは、その文字がファイルに入力されたためです。
ここでは変換は行われません。コマンドは単にファイルの内容が何であるかを通知するだけです。
答え2
このfile
コマンドは、分析するファイルに何が含まれているかを推測するだけです。ファイルのヘッダーから一定量のバイトを読み取って分析を行いますが、複数のステップで処理されることもあります (先頭に明確なマーカーが見つかった場合)。非構造化テキスト ファイルでは、拡張された文字数よりも多くの文字が読み取られる./file
ため、すべての文字が分析されます。
2 番目の例では、ファイルにいくつかの UTF-8 文字を配置し、それに基づいて文字セットfile
を使用してこのファイルを終了しますutf-8
。たとえば、ASCII 文字のみを含む 900Kb のファイルがあり、'utf-8' エコー行を追加した場合、file
UTF-8 でエンコードされた文字まで読み込まれていないため、ASCII でエンコードされたファイルとして報告されます。
閾値は100Kb付近にある