web-dev-qa-db-ja.com

テキストファイルのエンコードをテストするにはどうすればよいですか。有効ですか、それは何ですか。

私はいくつか持っている .htmGedit で開くファイルは警告/エラーなしで表示されますが、Jeditで同じファイルを開くと、UTF-8エンコードが無効であることを警告します...

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

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

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

55
Peter.O

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

70
lesmana

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

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

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

  • file
  • Perl Encode::Guess (標準ディストリビューションの一部)は、バイト文字列に対して連続したエンコーディングを試み、文字列が有効なテキストである最初のエンコーディングを返します。
  • Enca は、エンコーディング推測機能とコンバーターです。言語名と、その言語であると推定されるテキスト(サポートされている言語は主に東ヨーロッパの言語です)を指定すると、エンコーディングを推測しようとします。

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

また、あなたが-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

1
Mohamed23gharbi