ファイルが有効な UTF-8 かどうかを確認するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/115210

質問

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

あります ウェブサービス W3C では機能しなくなっているようですが、Windows のみの検証を見つけました。 道具 これは無効な UTF-8 ファイルを報告しますが、どの行/文字を修正するかは報告しません。

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

役に立ちましたか?

解決

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 とみなされます。

他のヒント

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')

使用できます isutf8 から もっと見る コレクション。

$ apt-get install moreutils
$ isutf8 your_file

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

ヌーはどうですか アイコンv 図書館?iconv() 関数の使用:「入力内に無効なマルチバイト シーケンスが検出されました。この場合、errno を EILSEQ に設定し、(size_t)(-1) を返します。*inbuf は無効なマルチバイト シーケンスの先頭を指したままです。」

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top