ファイルが有効な UTF-8 かどうかを確認するにはどうすればよいですか?
-
02-07-2019 - |
質問
有効な 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')
所属していません StackOverflow