ファイルのエンコードを検出する方法は?


115

私のファイルシステム(Windows 7)には、いくつかのテキストファイルがあります(重要な場合、これらはSQLスクリプトファイルです)。

Notepad ++で開くと、「エンコード」メニューで「UCS-2リトルエンディアン」と「BOMなしのUTF-8」のエンコードが報告されます。

ここの違いは何ですか?それらはすべて完全に有効なスクリプトのようです。Notepad ++なしでファイルにどのエンコーディングが含まれているかをどのように確認できますか?


7
Firefoxを使用する非常に簡単な方法があります。Firefoxを使用してファイルを開き、[表示]> [文字エンコード]を選択します。詳細はこちら
キャサリンガスニエ14

ヒューリスティックを使用します。チェックアウトencaおよびchardetPOSIXシステム用。
ヤヌストロエルセン14年

3
別の答えはトライアルとエラーだと思います。iconv特にこの目的に役立ちます。基本的に、破損した文字列/テキストを異なるエンコーディングで繰り返し処理して、どれが機能するかを確認します。キャラクターが破損しなくなったら勝ちです。ここで、プログラマチックな例を挙げて答えたいと思います。しかし、残念なことに保護された質問です。
ブランドンバーテルセン

FFはMozilla Charset Detectorsを使用しています。別の簡単な方法は、MS wordでファイルを開くことです。これは、さまざまな古代の中国語および日本語のコードページでもファイルを非常に正確に推測します
-phuclv

場合chardetchardetect(例えば、あなたのシステムでは使用できません、あなたはあなたのパッケージマネージャ経由でパッケージをインストールすることができますapt search chardet-のUbuntu / Debianのパッケージは、通常と呼ばれる上python-chardetまたはpython3-chardet)または経由ピップとのpip install chardet(またはpip install cchardetより高速なC-最適化されたバージョンのため)。
ccpizza

回答:


97

ファイルは通常、ファイルヘッダーを使用してエンコードを示します。ここには多くの例があります。ただし、ヘッダー読んでも、ファイルが実際に使用しているエンコーディングを確認することはできません

例えば、最初の3バイトのファイルが0xEF,0xBB,0xBFあり、おそらく UTF-8でエンコードされたファイル。ただし、文字で始まるISO-8859-1ファイルである場合があります。または、完全に異なるファイルタイプである可能性があります。

Notepad ++は、ファイルが使用しているエンコーディングを推測するために最善を尽くし、ほとんどの場合それを正しくします。ただし、間違っている場合もあります。そのため、「エンコード」メニューが表示されるため、最良の推測を上書きできます。

あなたが言及する2つのエンコーディングについて:

  • 「UCS-2リトルエンディアン」ファイルはUTF-16ファイル(ここでの情報から理解した内容に基づく)であるため、最初の2バイトから始まる可能性があり0xFF,0xFEます。私の知る限り、Notepad ++はUTF-16の特定のファセットをサポートしていないため、「UCS-2」と記述しています。
  • 「BOMなしのUTF-8」ファイルには、ヘッダーバイトがありません。それが「BOMなし」ビットの意味です。


2
BOMで始まるファイルが「BOMなしのUTF-8」として自動検出されるのはなぜですか?
マイケルボルグワード

2
また、ファイルが0xFF、0xFEで始まっている場合、UCS-2ではなくUTF-16として自動検出される必要があります。UCS-2には、主にASCII文字が含まれており、したがって1バイトおきにヌルであるため、おそらく推測されます。
マイケルボルグワード

2
経験上、悲しいかな、メタデータ(「ヘッダー」)も間違っている可能性があります。情報を保持しているデータベースが破損しているか、元のアップローダーがこれを間違っている可能性があります。(これは過去数ヶ月で私たちにとって重大な問題でした。一部のデータは「UTF-8」としてアップロードされましたが、「本当に同じだから本当にISO8859-1でしたか?!」メタデータの作成から離れ、彼らはそれを間違えただけです…)
ドナルドフェローズ

1
実際、世界中のどのファイルも「」で始まることはないので、エンコードの問題が2014年のままであることは「面白い」と思います。 。それは確率の問題です。別のエンコーディングが奇妙な文字を回避する場合、間違ったエンコーディングを選択することは考えられません。奇妙な文字を回避するエンコーディングを探すと、99,9999%のケースで機能すると思います。しかし、まだエラーが..また、それはスペースを節約するために、ASCIIの代わりに、UTF8を使用することは非常に紛らわしいメッセージだ...それは混乱ジュニア開発者が行うのこのアイデアだ...がある
Revious

18

できません。それができれば、「ランダムなちらつき」のあるWebサイトやテキストファイルはそれほど多くありません。そのため、通常、エンコードはペイロードとともにメタデータとして送信されます。

そうでない場合、できることは「スマートな推測」だけですが、同じバイトシーケンスが複数のエンコーディングで有効な場合があるため、結果はしばしばあいまいになります。


2
では、Windows OSはその情報(メタデータ)を実際にどこかに保存しますか?おそらくレジストリに?
マルセル

あなたが間違っている。それはコードページであり、まったく同じではありません。Unicodeエンコーディングを推測するアルゴリズムがあります。
-DeadMG

6
@Marcel:いいえ。だからこそ、「テキストファイル」は、純粋なASCII以外のすべてに対して非常に問題があります。
マイケルボルグワード

notepad ++はこれを実行できます。テキストファイルがutf-8でエンコードされているかどうかを確認できます
user25
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.