44

VIMで作成したPHPファイルがありますが、どちらがエンコードされているのかわかりません。

ターミナルを使用し、コマンドfile -bi foo(私のオペレーティングシステムはUbuntu 11.04)でエンコードを確認すると、次の結果が得られます。

text/html; charset=us-ascii

しかし、geditでファイルを開くと、そのエンコーディングはUTF-8であると表示されます。

どちらが正しいですか?ファイルをUTF-8でエンコードしたい。

私の推測では、ファイルにBOMがなく、コマンドfile -biがファイルを読み取り、UTF-8文字を検出しないため、ASCIIであると想定されますが、実際にはUTF-8でエンコードされています。

4

4 に答える 4

72
$ file --mime my.txt 
my.txt: text/plain; charset=iso-8859-1
于 2015-01-19T02:52:41.350 に答える
57

まず、ASCIIはUTF-8のサブセットであることに注意してください。したがって、ファイルにASCII文字のみが含まれている場合は、ASCIIでエンコードされていると言うのが正しく、UTF-8でエンコードされていると言うのが正しいです。

そうは言っても、file通常はファイルの先頭にある短いセグメントのみを調べてそのタイプを判別するため、ASCII以外の文字が存在するが、ファイルの最初のセグメントを超えている場合は、us-asciiと宣言する可能性があります。一方、geditは、ASCIIであってもファイルがUTF-8であると言う場合があります。これは、UTF-8がgeditの優先文字エンコードであり、間に非ASCII文字を追加した場合にUTF-8でファイルを保存するためです。編集セッション。繰り返しますが、それがgeditが言っていることであれば、それは間違いではありません。

今あなたの質問に:

  1. 次のコマンドを実行します。

    tr -d \\000-\\177 < your-file | wc -c
    

    出力に「0」と表示されている場合、ファイルにはASCII文字のみが含まれています。ASCIIです(そして有効なUTF-8でもあります)話の終わり。

  2. このコマンドを実行します

    iconv -f utf-8 -t ucs-4 < your-file >/dev/null
    

    エラーが発生した場合、ファイルには有効なUTF-8が含まれていません(または、少なくともその一部が破損しています)。

    エラーが発生しない場合、ファイルはUTF-8である可能性が非常に高くなります。これは、UTF-8には、他の一般的に使用される文字エンコードの一般的なテキストを有効なUTF-8と間違えにくいプロパティがあるためです。

于 2012-06-13T18:49:19.937 に答える
30

(Linuxの場合)

$ chardet <filename>

また、出力の信頼水準[0-1]も提供します。

于 2016-03-11T11:19:50.437 に答える
0

@Celadaの回答と@ArthurZennigに基づいて、次の簡単なスクリプトを作成しました。

#/bin/bash

if [ "$#" -lt 1 ]
then
  echo "Usage: utf8-check filename"
  exit 1
fi

chardet $1
countchars="$(tr -d \\000-\\177 < $1 | wc -c)"
if [ $countchars -eq 0 ]
then
 echo "Ascii";
 exit 0
fi

{
  iconv -f utf-8 -t ucs-4 < $1 >/dev/null
  echo "UTF-8"
} || {
  echo "not UTF-8 or corrupted"
}
于 2016-06-18T15:19:15.170 に答える