テキストファイルのエンコーディングをテストするにはどうすればよいですか?有効ですか?


46

警告/エラーなし.htmGeditで開くファイルがいくつかありますが、これらの同じファイルをで開くとJedit、無効なUTF-8エンコーディングが警告されます...

HTMLメタタグには「charset = ISO-8859-1」と記載されています。Jeditでは、フォールバックエンコーディングリストとエンコーディング自動検出器のリスト(現在は「BOM XML-PI」)が許可されているため、当面の問題は解決されました。しかし、これは私に考えさせられました:メタデータがそこになかったらどうでしょうか?

エンコード情報が利用できない場合、どのエンコードが適用される可能性があるかを「推測」することができるCLIプログラムはありますか?

そして、それはわずかに異なる問題ですが。既知のエンコーディングの有効性をテストするCLIプログラムはありますか?


「テキストファイルのエンコードを自動検出する方法」に似ています superuser.com/questions/301552/...
buzz3791

回答:


60

このfileコマンドは、エンコーディングについて「最良の推測」を行います。-iパラメータを使用してfile、エンコードに関する情報を強制的に印刷します。

デモンストレーション:

$ file -i *
umlaut-iso88591.txt: text/plain; charset=iso-8859-1
umlaut-utf16.txt:    text/plain; charset=utf-16le
umlaut-utf8.txt:     text/plain; charset=utf-8

ファイルの作成方法は次のとおりです。

$ echo ä > umlaut-utf8.txt 

現在、すべてがutf-8です。しかし、自分を納得させる:

$ hexdump -C umlaut-utf8.txt 
00000000  c3 a4 0a                                          |...|
00000003

https://en.wikipedia.org/wiki/Ä#Computer_encodingと比較してください

他のエンコーディングに変換します:

$ iconv -f utf8 -t iso88591 umlaut-utf8.txt > umlaut-iso88591.txt 
$ iconv -f utf8 -t utf16 umlaut-utf8.txt > umlaut-utf16.txt 

16進ダンプを確認します。

$ hexdump -C umlaut-iso88591.txt 
00000000  e4 0a                                             |..|
00000002
$ hexdump -C umlaut-utf16.txt 
00000000  ff fe e4 00 0a 00                                 |......|
00000006

3つすべてを混合して「無効な」何かを作成します。

$ cat umlaut-iso88591.txt umlaut-utf8.txt umlaut-utf16.txt > umlaut-mixed.txt 

fileと言います:

$ file -i *
umlaut-iso88591.txt: text/plain; charset=iso-8859-1
umlaut-mixed.txt:    application/octet-stream; charset=binary
umlaut-utf16.txt:    text/plain; charset=utf-16le
umlaut-utf8.txt:     text/plain; charset=utf-8

なし-i

$ file *
umlaut-iso88591.txt: ISO-8859 text
umlaut-mixed.txt:    data
umlaut-utf16.txt:    Little-endian UTF-16 Unicode text, with no line terminators
umlaut-utf8.txt:     UTF-8 Unicode text

fileコマンドは、「有効」または「無効」のないアイデアを持っていません。それは単にいくつかのバイトを見て、エンコーディングが何であるかを推測しようとします。人間として、ファイルが「間違った」エンコーディングのウムラウトを含むテキストファイルであることを認識することができるかもしれません。しかし、コンピューターとしては、何らかの人工知能が必要です。

ヒューリスティックfileは何らかの人工知能であると主張する人もいるかもしれません。しかし、たとえそうであっても、それは非常に限られたものです。

fileコマンドの詳細は次のとおりです。http//www.linfo.org/file_command.html


おかげで、うまくいきました... 'file , but without any option :( ... I've now also tried a mixof UTF-16 and UTF-8 and ISO-8859-1. file -i`を試しましたunknown-8bit。したがって、これは「無効/不明なエンコーディングを検出する方法」
-Peter.O

ここに来てMacを使用している場合file -Iは、小文字ではなく大文字の「i」を使用します。
サムライソウル

21

テキストファイルのエンコーディングが何であるかを常に確認できるとは限りません。たとえば、バイトシーケンス\303\275c3 bd16進数)はý、UTF-8、ýlatin1、Ă˝latin2、BIG-5などになります。

一部のエンコードには無効なバイトシーケンスがあるため、確実に除外することができます。これは特にUTF-8に当てはまります。ほとんどの8ビットエンコーディングのほとんどのテキストは有効なUTF-8ではありません。あなたは、有効なUTF-8とのためにテストすることができますisutf8からmoreutilsかとiconv -f utf-8 -t utf-8 >/dev/null、とりわけ。

テキストファイルのエンコーディングを推測しようとするツールがあります。彼らは間違いを犯す可能性がありますが、故意にだまそうとしない限り、実際に機能することがよくあります。

  • file
  • PerlEncode::Guess(標準配布の一部)は、バイト文字列で連続したエンコードを試行し、文字列が有効なテキストである最初のエンコードを返します。
  • Encaは、符号化推測とコンバータです。言語名とその言語であると思われるテキスト(サポートされている言語のほとんどは東ヨーロッパ言語)を指定し、エンコードを推測しようとします。

ファイルにメタデータ(HTML / XML charset=、TeX \inputenc、emacs -*-coding-*-、…)がある場合、EmacsやVimなどの高度なエディターは、多くの場合、そのメタデータを解析できます。ただし、コマンドラインから自動化するのは簡単ではありません。


おかげで良いの概要については...はい、「最高の推測では、」...エンコーディングが知られていない唯一の選択肢で使用することができiconv、私はちょうどに記載されているすべての1168件のエンコーディング(別名を含む)走ったiconv -l私の.htmファイルのいずれに対しての...マスタリングに合格した683のエンコーディングがありました。ファイルの実際のcharset = ISO-8859-1 ..すべてのバー1 ASCII範囲値で構成されています。非ASCII文字は\ xA9でした。
Peter.O

0

また、ファイル-iが不明の場合

以下のような文字セットを推測できるこのphpコマンドを使用できます。

phpでは、以下のように確認できます。

エンコードリストを明示的に指定する:

php -r "echo 'probably : ' . mb_detect_encoding(file_get_contents('myfile.txt'), 'UTF-8, ASCII, JIS, EUC-JP, SJIS, iso-8859-1') . PHP_EOL;"

より正確な " mb_list_encodings ":

php -r "echo 'probably : ' . mb_detect_encoding(file_get_contents('myfile.txt'), mb_list_encodings()) . PHP_EOL;"

ここで最初の例では、一致する可能性のあるエンコードのリスト(リストの順序を検出)を配置していることがわかります。より正確な結果を得るには、次の方法ですべての可能なエンコードを使用できます:mb_list_encodings()

注意mb_ *関数にはphp-mbstringが必要です

apt-get install php-mbstring 

回答を参照してください:https : //stackoverflow.com/a/57010566/3382822

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.