私はいくつか持っている .htm
Gedit で開くファイルは警告/エラーなしで表示されますが、Jedit
で同じファイルを開くと、UTF-8エンコードが無効であることを警告します...
HTMLメタタグには、「charset = ISO-8859-1」と記載されています。 Jeditでは、フォールバックエンコーディングのリストおよびエンコーディング自動検出器のリスト(現在は「BOM XML-PI」)なので、当面の問題は解決されました。しかし、これは私に考えさせられました:メタデータがそこになかったらどうでしょうか?
エンコーディング情報が利用できない場合、どのエンコーディングが適用されるかを「推測」できるCLIプログラムはありますか?
そして、それは少し異なる問題ですが、 knownエンコーディングの有効性をテストするCLIプログラムはありますか?
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
テキストファイルのエンコーディングが何であるかを常に確認できるとは限りません。たとえば、バイトシーケンス\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
Encode::Guess
(標準ディストリビューションの一部)は、バイト文字列に対して連続したエンコーディングを試み、文字列が有効なテキストである最初のエンコーディングを返します。ファイルにメタデータ(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