web-dev-qa-db-ja.com

ファイルが有効なUTF-8かどうかを確認する方法は?

有効なUTF-8であるはずのデータファイルを処理していますが、そうではないため、パーサー(私の制御下にない)が失敗します。 UTF-8整形式のデータを事前検証する段階を追加したいのですが、これを支援するユーティリティはまだ見つかりません。

W3Cには web service があり、死んでいるように見えます。Windowsのみの検証が見つかりました tool 無効なUTF-8ファイルを報告しますが、どの修正する行/文字。

立ち寄って使用できるツール(理想的にはクロスプラットフォーム)、またはデータの読み込みプロセスの一部にできるRuby/Perlスクリプトのいずれかに満足します。

63
Ian Dickinson

GNU iconv:

$ iconv -f UTF-8 your_file -o /dev/null; echo $?

または、macOSなどの古いバージョンのiconvの場合:

$ iconv -f UTF-8 your_file > /dev/null; echo $?

ファイルが正常に変換された場合、コマンドは0を返し、そうでない場合は1を返します。さらに、無効なバイトシーケンスが発生したバイトオフセットを出力します。

編集:出力エンコーディングを指定する必要はありません。UTF-8であると想定されます。

85
Torsten Marek

pythonおよびstr.encode | decode関数を使用します。

>>> a="γεια"
>>> a
'\xce\xb3\xce\xb5\xce\xb9\xce\xb1'
>>> b='\xce\xb3\xce\xb5\xce\xb9\xff\xb1' # note second-to-last char changed
>>> print b.decode("utf_8")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.5/encodings/utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xff in position 6: unexpected code byte

スローされた例外には、その.argsプロパティで要求された情報があります。

>>> try: print b.decode("utf_8")
... except UnicodeDecodeError, exc: pass
...
>>> exc
UnicodeDecodeError('utf8', '\xce\xb3\xce\xb5\xce\xb9\xff\xb1', 6, 7, 'unexpected code byte')
>>> exc.args
('utf8', '\xce\xb3\xce\xb5\xce\xb9\xff\xb1', 6, 7, 'unexpected code byte')
9
tzot

moreutils コレクションの isutf8 を使用できます。

$ apt-get install moreutils
$ isutf8 your_file

シェルスクリプトでは、--quiet切り替えて終了ステータスを確認します。有効なutf-8のファイルの場合はゼロです。

9
Roger Dahl

Gnu iconv ライブラリはどうですか? iconv()関数の使用:「入力に無効なマルチバイトシーケンスが見つかりました。この場合、errnoをEILSEQに設定し、(size_t)(-1)を返します。* inbufは、無効なマルチバイトシーケンスの先頭を指しています。 」

編集:ああ-スクリプト言語が必要な部分を見逃しました。ただし、コマンドラインの作業では、 iconv ユーティリティも検証する必要があります。

4
AShelly