سؤال

أنا معالجة بعض ملفات البيانات التي من المفترض أن تكون صالحة UTF-8 ولكن ليست مما يسبب محلل (ليس تحت سيطرتي) أن تفشل.أود أن أضيف مرحلة ما قبل التحقق من صحة البيانات UTF-8 بشكل جيد formedness ، ولكن لم يتم العثور حتى الآن أداة للمساعدة في القيام بذلك.

هناك خدمة ويب في W3C والتي يبدو أن الميت ، لقد وجدت ويندوز فقط التحقق من صحة أداة أن تقارير غير صالحة UTF-8 ملفات ولكن لا التقرير الذي الخطوط/الشخصيات إلى إصلاح.

سأكون سعيدا مع أي أداة لا يمكن أن تسقط في استخدام (من الناحية المثالية عبر منصة) ، أو روبي/perl أنا يمكن أن تجعل جزء من البيانات عملية التحميل.

هل كانت مفيدة؟

المحلول

يمكنك استخدام جنو iconv:

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

أو مع الإصدارات القديمة من iconv مثل ماك:

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

الأمر سيعود 0 إذا كان الملف يمكن تحويلها بنجاح ، 1 إن لم يكن.بالإضافة إلى ذلك ، فإنه سيتم طباعة إزاحة البايت حيث بطلان تسلسل بايت حدث.

تحرير:الإخراج ترميز لا يجب أن تكون محددة ، سيكون من المفترض أن يكون UTF-8.

نصائح أخرى

استخدام بيثون str.ترميز|فك ترميز الوظائف.

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

الاستثناء طرح لديه المعلومات المطلوبة في .وسائط الملكية.

>>> 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 من moreutils جمع.

$ apt-get install moreutils
$ isutf8 your_file

في قذيفة النصي, استخدام --quiet التبديل التحقق من الخروج من الحالة التي هو صفر عن الملفات التي هي صالحة utf-8.

ماذا عن جنو iconv المكتبة ؟ باستخدام iconv (وظيفة):"غير صالح multibyte تسلسل واجه في المدخلات.في هذه الحالة مجموعات errno إلى EILSEQ وإرجاع (size_t)(-1).*inbuf تبقى الإشارة إلى بداية غير صالحة multibyte تسلسل."

تحرير:يا فاتني الجزء حيث كنت ترغب في لغة البرمجة.ولكن من أجل قيادة خط العمل ، iconv أداة التحقق من صحة بالنسبة لك أيضا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top