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


23

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


piconvエンコーディングを変更するには;)
Rinzwind

はい。すでにエンコーディングを変更しています(1ファイル)。しかし、私にはこれらの多くがあり、それらすべてを制御し、必要に応じて秘密にする小さなスクリプトを作成したかったのです。しかし、私はそれらをすべて変換できると思います。一部がすでにUTF-8である場合、害はありません。右?
非標準モデル

問題ありません:)ワイルドカードを使用するだけです
-Rinzwind

回答:


26

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

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

問題は、多くのコーデックが類似しており、同じ「有効なバイトパターン」を持ち、単に異なる文字として解釈することです。たとえば、あるäエンコーディングはé別のエンコーディングまたは別のエンコーディングに対応しøます。コンピュータは、バイトをどのように解釈すれば正しく人間が読み取れるテキストになるかを実際に検出することはできません(すべての種類の言語の辞書を追加してスペルチェックを実行できる場合を除く)。また、一部の文字セットは実際には他の文字セットのサブセットであることも知っておく必要があります。たとえば、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スクリプトを提供できます。このスクリプトは、完全なファイルをスキャンし、指定された文字セットを使用してデコードを試みます。成功した場合、そのエンコーディングは潜在的な候補です。それ以外の場合、それでデコードできないバイトがある場合、リストからその文字セットを削除できます。


ANSIは実際には文字エンコーディングの名前ではありません。おそらく、ASCII文字エンコードで表現できるANSIエスケープコードを考えているのでしょう。
カスペルド

@kasperdほとんどの場合、彼はISO 8859またはWindowコードページファミリのいずれかを参照しています。北米のWindows開発者にとって、ANSIエンコーディングは多くの場合、歴史的な理由からWindows 1252エンコーディングを意味します。
user1937198

ええ、まあ、ANSIは基本的にASCII(コード0-127)とロケール固有のコードページ(コード128-255)です。あなたそうだ右...
バイト司令


12

指定されたプログラム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


2
とにかく推測できます。
ホッブズ

2
file推測しますが、あまりよくありません。たとえば、私のテストでは、MacRomanとCP-1252の両方をISO-8859と誤認し、その結果、「š」と「ß」がスクランブルされました。
マーク

いいね!古い.sqlファイルの正しいエンコードを見つけるために数時間を費やし、file実際にgzip圧縮ファイルであることを示しました!
アミレザ・ナシリ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.