web-dev-qa-db-ja.com

ファイルで使用されているエンコーディングを確認するにはどうすればよいですか

ビデオomxplayerの字幕ファイルに問題がありました。それを解決するには、windows-1250からUTF-8エンコーディングに変換する必要がありました。私の質問は、どのエンコードが使用されている特定のファイルをどのように確認できますか?

22

ファイルが元々エンコーディングXで書き込まれたかどうかを実際に自動的に見つけることはできません。

しかし簡単にできることは、特定のコーデックを使用して、完全なファイルが何らかの方法で(必ずしも正しくではない)正常にデコードできるかどうかを確認することです。特定のエンコーディングに有効でないバイトが見つかった場合、それは別のものである必要があります。

問題は、多くのコーデックが類似しており、同じ「有効なバイトパターン」を持ち、単に異なる文字として解釈することです。たとえば、あるエンコーディングのäは、別のエンコーディングのéまたは3番目のエンコーディングのøに対応する場合があります。コンピューターは、バイトをどのように解釈するかを実際に人間が読むことのできるテキストとして正しく検出することはできません(すべての種類の言語の辞書を追加してスペルチェックを実行できる場合を除く)。また、一部の文字セットは実際には他の文字セットのサブセットであることも知っておく必要があります。 ASCIIエンコーディングは、ANSIファミリまたはUTF-8のような最も一般的に使用されるコーデックの一部です。これは、たとえば、UTF-8として保存された単純なラテン文字のみを含むテキストは、ASCIIとして保存された同じファイルと同一であることを意味します。


ただし、実行できないことの説明から、実際に実行できることの説明に戻りましょう。

ASCII /非ASCII(通常UTF-8)テキストファイルの基本的なチェックには、fileコマンドを使用できます。ただし、多くのコーデックを認識せず、ファイルの最初の数kBのみを検査します。残りには新しい文字が含まれないと仮定します。一方、さまざまなスクリプト、HTML/XMLドキュメント、および多くのバイナリデータ形式(テキストファイルの比較にはまったく関心がありません)など、他の一般的なファイルタイプも認識し、極端に長い行があるかどうか、または改行シーケンスのタイプ(UNIX:LF、Windows:CR + LFなど)が使用されます。

$ cat ascii.txt 
I am an ASCII file.
Just text and numb3rs and simple punctuation...

$ cat utf8.txt 
I am a Unicode file.
Special characters like Ω€®Ŧ¥↑ıØÞöäüß¡!

$ file ascii.txt utf8.txt 
ascii.txt: ASCII text
utf8.txt:  UTF-8 Unicode text

それで十分でない場合は、 この回答 で記述したPythonスクリプトを提供できます。これは、完全なファイルをスキャンし、指定された文字セットを使用してデコードを試みます。成功した場合、そのエンコーディングは潜在的な候補です。それ以外の場合、それでデコードできないバイトがある場合、リストからその文字セットを削除できます。

25
Byte Commander

fileという名前のプログラムがこれを実行できます。例:

$ echo aaa >> FILE
$ file FILE
FILE: ASCII text, with CRLF, LF line terminators
$ echo öäü >> FILE
$ file FILE
FILE: UTF-8 Unicode text, with CRLF, LF line terminators

その方法に興味がある場合は、src/encoding.cを参照してください。

8