72

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

W3C には機能していないように見えるWeb サービスがあり、無効な UTF-8 ファイルを報告するが、どの行/文字を修正すべきかを報告しないWindows 専用の検証ツールを見つけました。

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

4

6 に答える 6

102

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

于 2008-09-22T14:48:53.490 に答える
9

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')
于 2008-09-22T14:44:16.123 に答える
5

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

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

于 2008-09-22T14:46:06.133 に答える
0

を使用することもできますrecode。これは、UTF-8 をデコードしようとして無効な文字が検出された場合にエラーで終了します。

if recode utf8/..UCS < "$FILE" >/dev/null 2>&1; then
    echo "Valid utf8 : $FILE"
else
    echo "NOT valid utf8: $FILE"
fi

これは、有効な UTF-8 から常に可能なUniversal Character Set (UCS)に再コード化しようとします。

于 2020-02-20T20:43:42.877 に答える