it-swarm.asia

أنت 'uufeff' في سلسلة بايثون

أحصل على خطأ في الخليط التالي:

UnicodeEncodeError: 'ascii' codec can't encode character u'\ufeff' in position 155: ordinal not in range(128)

لست متأكدًا من ماهية u'\ufeff' ، فهي تظهر عندما أقوم بالبحث على الويب. كيف يمكنني علاج الموقف؟ طريقة السلسلة .replace() لا تعمل عليها.

86
James Hallen

حرف Unicode U+FEFF هو علامة ترتيب البايت ، أو BOM ، ويستخدم لمعرفة الفرق بين تشفير UTF-16 الكبير والقليل. إذا قمت بفك تشفير صفحة الويب باستخدام برنامج الترميز الصحيح ، فستقوم Python بإزالتها من أجلك. أمثلة:

#!python2
#coding: utf8
u = u'ABC'
e8 = u.encode('utf-8')        # encode without BOM
e8s = u.encode('utf-8-sig')   # encode with BOM
e16 = u.encode('utf-16')      # encode with BOM
e16le = u.encode('utf-16le')  # encode without BOM
e16be = u.encode('utf-16be')  # encode without BOM
print 'utf-8     %r' % e8
print 'utf-8-sig %r' % e8s
print 'utf-16    %r' % e16
print 'utf-16le  %r' % e16le
print 'utf-16be  %r' % e16be
print
print 'utf-8  w/ BOM decoded with utf-8     %r' % e8s.decode('utf-8')
print 'utf-8  w/ BOM decoded with utf-8-sig %r' % e8s.decode('utf-8-sig')
print 'utf-16 w/ BOM decoded with utf-16    %r' % e16.decode('utf-16')
print 'utf-16 w/ BOM decoded with utf-16le  %r' % e16.decode('utf-16le')

لاحظ أن EF BB BF عبارة عن BOM بترميز UTF-8. إنه غير مطلوب من أجل UTF-8 ، ولكنه يعمل فقط كتوقيع (عادةً على نظام Windows).

انتاج:

utf-8     'ABC'
utf-8-sig '\xef\xbb\xbfABC'
utf-16    '\xff\xfeA\x00B\x00C\x00'    # Adds BOM and encodes using native processor endian-ness.
utf-16le  'A\x00B\x00C\x00'
utf-16be  '\x00A\x00B\x00C'

utf-8  w/ BOM decoded with utf-8     u'\ufeffABC'    # doesn't remove BOM if present.
utf-8  w/ BOM decoded with utf-8-sig u'ABC'          # removes BOM if present.
utf-16 w/ BOM decoded with utf-16    u'ABC'          # *requires* BOM to be present.
utf-16 w/ BOM decoded with utf-16le  u'\ufeffABC'    # doesn't remove BOM if present.

لاحظ أن برنامج الترميز utf-16 يتطلب BOM أن يكون موجودًا ، أو لن يعرف Python ما إذا كانت البيانات كبيرة أم لا.

126
Mark Tolonen

لقد واجهت هذا على بيثون 3 وجدت هذا السؤال (و الحل ). عند فتح ملف ، يدعم Python 3 الكلمة الأساسية للترميز لمعالجة الترميز تلقائيًا.

بدون ذلك ، يتم تضمين BOM في نتيجة القراءة:

>>> f = open('file', mode='r')
>>> f.read()
'\ufefftest'

إعطاء الترميز الصحيح ، تم حذف BOM في النتيجة:

>>> f = open('file', mode='r', encoding='utf-8-sig')
>>> f.read()
'test'

فقط بلدي 2 سنتا.

60
siebz0r

هذه الشخصية هي BOM أو "علامة ترتيب البايت". يتم استلامها عادةً باعتبارها البايتات القليلة الأولى من الملف ، والتي تخبرك بكيفية تفسير تشفير بقية البيانات. يمكنك ببساطة إزالة الشخصية للمتابعة. على الرغم من أن الخطأ يشير إلى أنك تحاول التحويل إلى "ascii" ، فمن المحتمل أن تختار ترميزًا آخر لكل ما تحاول القيام به.

4
swstephe

يتم تشفير المحتوى الذي تقوم بتجريده في نص أحادي بدلاً من نص ascii ، وستحصل على شخصية لا تتحول إلى ascii. تعتمد "الترجمة" الصحيحة على ما اعتقدت عليه صفحة الويب الأصلية. صفحة يونيكود بيثون تعطي الخلفية عن كيفية عملها.

هل تحاول طباعة النتيجة أو لصقها في ملف؟ الخطأ يوحي بأنه الكتابة البيانات التي تسبب المشكلة ، وليس قراءتها. هذا السؤال هو مكان جيد للبحث عن الإصلاحات.

4
theodox

تنشأ هذه المشكلة بشكل أساسي عند حفظ رمز python في تشفير UTF-8 أو UTF-16 لأن python يضيف بعض الأحرف الخاصة في بداية الرمز تلقائيًا (والتي لا تظهر بواسطة برامج تحرير النصوص) لتحديد تنسيق الترميز. ولكن ، عند محاولة تنفيذ التعليمات البرمجية ، يمنحك خطأ في بناء الجملة في السطر 1 ، بداية الرمز لأن python compiler يفهم ASCII _ encoding . عند عرض رمز الملف باستخدام قراءة () وظيفة يمكنك أن ترى في بداية التعليمات البرمجية التي تم إرجاعها '\ ufeff' هو مبين. إن أبسط الحلول لهذه المشكلة هو فقط عن طريق تغيير الترميز إلى ASCII الترميز (لهذا يمكنك نسخ الكود الخاص بك إلى المفكرة وحفظه تذكر! اختر ASCII الترميز ... آمل أن يساعد هذا.

0
Jagdish Chauhan