পাইথন স্ট্রিংয়ে আপনি 'ইউফেফ'


152

আমি নিম্নলিখিত প্যাটারের সাথে একটি ত্রুটি পেয়েছি:

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

কী u'\ufeff'তা নিশ্চিত নয় , আমি ওয়েব স্ক্র্যাপিংয়ের সময় এটি প্রদর্শিত হয়। আমি কীভাবে পরিস্থিতি প্রতিকার করতে পারি? .replace()স্ট্রিং পদ্ধতি এটা কাজ করে না।


6
এই ইনপুট কোথা থেকে আসে? আপনি কি করতে চেষ্টা করছেন? দয়া করে আপনার পাইথন কোডটি অন্তর্ভুক্ত করুন।

7
ঘটনাক্রমে, আমি দেখতে পেয়েছি যে ইউনিকোড সূচকটি মনে পড়লে .rep (আধুনিক) অজগরটিতে কাজ করে: s.replace (u 'fefeff', '')
ডগ ব্র্যাডশ

@ ডগব্র্যাশশ যখন আপনি "আধুনিক অজগর" বলছেন, আপনার অর্থ কী, 2.7+ বা 3.0+?
তেভুয়ান

ভাল যুক্তি. অর্থ, 2.7+।
ডগ ব্র্যাডশো

উত্তর:


184

ইউনিকোড অক্ষরটি U+FEFFবাইট অর্ডার চিহ্ন বা বিওএম এবং বড় এবং ছোট্ট এন্ডিয়ান ইউটিএফ -16 এনকোডিংয়ের মধ্যে পার্থক্য জানাতে ব্যবহৃত হয়। আপনি যদি ডান কোডেক ব্যবহার করে ওয়েব পৃষ্ঠাটি ডিকোড করেন তবে পাইথন এটি আপনার জন্য সরিয়ে ফেলবে। উদাহরণ:

#!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একটি ইউটিএফ-8-এনকোডড বিওএম। এটি ইউটিএফ -8 এর জন্য প্রয়োজনীয় নয়, তবে এটি কেবল স্বাক্ষর হিসাবে কাজ করে (সাধারণত উইন্ডোজে)।

আউটপুট:

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 উপস্থিত হতে, অথবা যদি তথ্য big- বা অল্প endian হয় পাইথন জানেন করা হবে না।


200

আমি পাইথন 3 এ ছুটে গিয়ে এই প্রশ্নটি (এবং সমাধান ) পেয়েছি । কোনও ফাইল খোলার সময় পাইথন 3 স্বয়ংক্রিয়ভাবে এনকোডিংটি পরিচালনা করতে এনকোডিং কীওয়ার্ড সমর্থন করে।

এটি ছাড়া, বিওএম পড়ার ফলাফলের অন্তর্ভুক্ত:

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

সঠিক এনকোডিং দেওয়া, ফলাফলের মধ্যে বিওএম বাদ দেওয়া হয়েছে:

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

শুধু আমার 2 সেন্ট।


13
ধন্যবাদ, এটি আসল সমাধান এবং এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। যদিও এই কেন স্ট্রিং আছে উপর মহান অন্তর্দৃষ্টি, মানুষ এখানে আসার অধিকাংশ একটি সহজবোধ্য সমাধান খুঁজছে এবং এই এটা।
নিউরিনো

3
এক্সিল থেকে সংরক্ষিত সিএসভি ফাইল পড়ে সিএসভি ডিক্টরিডারের সাথে একই সমস্যা ছিল।
লরন্টজ

1
হ্যাঁ, এক্সেল (এমনকি এক্সেল দ্বারা উত্পাদিত "সিএসভি") সত্যই একটি উত্তেজনাপূর্ণ।
ওসপ্রে

4

সেই চরিত্রটি হ'ল বিওএম বা "বাইট অর্ডার মার্ক"। এটি সাধারণত কোনও ফাইলের প্রথম কয়েকটি বাইট হিসাবে প্রাপ্ত হয়, আপনাকে কীভাবে বাকী ডেটার এনকোডিংটি ব্যাখ্যা করতে হয় তা বলে। চালিয়ে যাওয়ার জন্য আপনি অক্ষরটি সরাতে পারেন। তবুও, যেহেতু ত্রুটিটি বলেছে যে আপনি 'এসকিআই' তে রূপান্তর করার চেষ্টা করছেন, আপনি যা করতে চেষ্টা করছেন তার জন্য সম্ভবত অন্য একটি এনকোডিং বেছে নেওয়া উচিত।


4

আপনি যে সামগ্রীটি স্ক্র্যাপ করছেন তা অ্যাস্কি টেক্সটের পরিবর্তে ইউনিকোডে এনকোড করা হয়েছে এবং আপনি এমন একটি চরিত্র পেয়েছেন যা এসকিআই তে রূপান্তরিত হয় না। ডান 'অনুবাদ' নির্ভর করে যে মূল ওয়েব পৃষ্ঠাটি এটি কী ছিল on পাইথনের ইউনিকোড পৃষ্ঠা এটি কীভাবে কাজ করে তার পটভূমি দেয়।

আপনি কি ফলাফল মুদ্রণ করার চেষ্টা করছেন বা কোনও ফাইলে আটকে রেখেছেন? ত্রুটিটি পরামর্শ দেয় যে এটি ডেটা লিখছে যা সমস্যার সৃষ্টি করে, এটি না পড়ে। এই প্রশ্নটি সমাধানগুলি দেখার জন্য ভাল জায়গা।


0

এখানে মার্ক টোলোনেনের উত্তরের ভিত্তিতে তৈরি করা হয়েছে। স্ট্রিংটিতে '|' দ্বারা পৃথক 'পরীক্ষা' শব্দের বিভিন্ন ভাষা অন্তর্ভুক্ত ছিল, যাতে আপনি পার্থক্যটি দেখতে পারেন।

u = u'ABCtestβ貝塔위másbêta|test|اختبار|测试|測試|テスト|परीक्षा|പരിശോധന|פּרובירן|kiểm tra|Ölçek|'
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'))

এখানে একটি পরীক্ষা চালানো হয়:

>>> u = u'ABCtestβ貝塔위másbêta|test|اختبار|测试|測試|テスト|परीक्षा|പരിശോധന|פּרובירן|kiểm tra|Ölçek|'
>>> 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)
utf-8     b'ABCtest\xce\xb2\xe8\xb2\x9d\xe5\xa1\x94\xec\x9c\x84m\xc3\xa1sb\xc3\xaata|test|\xd8\xa7\xd8\xae\xd8\xaa\xd8\xa8\xd8\xa7\xd8\xb1|\xe6\xb5\x8b\xe8\xaf\x95|\xe6\xb8\xac\xe8\xa9\xa6|\xe3\x83\x86\xe3\x82\xb9\xe3\x83\x88|\xe0\xa4\xaa\xe0\xa4\xb0\xe0\xa5\x80\xe0\xa4\x95\xe0\xa5\x8d\xe0\xa4\xb7\xe0\xa4\xbe|\xe0\xb4\xaa\xe0\xb4\xb0\xe0\xb4\xbf\xe0\xb4\xb6\xe0\xb5\x8b\xe0\xb4\xa7\xe0\xb4\xa8|\xd7\xa4\xd6\xbc\xd7\xa8\xd7\x95\xd7\x91\xd7\x99\xd7\xa8\xd7\x9f|ki\xe1\xbb\x83m tra|\xc3\x96l\xc3\xa7ek|'
>>> print('utf-8-sig %r' % e8s)
utf-8-sig b'\xef\xbb\xbfABCtest\xce\xb2\xe8\xb2\x9d\xe5\xa1\x94\xec\x9c\x84m\xc3\xa1sb\xc3\xaata|test|\xd8\xa7\xd8\xae\xd8\xaa\xd8\xa8\xd8\xa7\xd8\xb1|\xe6\xb5\x8b\xe8\xaf\x95|\xe6\xb8\xac\xe8\xa9\xa6|\xe3\x83\x86\xe3\x82\xb9\xe3\x83\x88|\xe0\xa4\xaa\xe0\xa4\xb0\xe0\xa5\x80\xe0\xa4\x95\xe0\xa5\x8d\xe0\xa4\xb7\xe0\xa4\xbe|\xe0\xb4\xaa\xe0\xb4\xb0\xe0\xb4\xbf\xe0\xb4\xb6\xe0\xb5\x8b\xe0\xb4\xa7\xe0\xb4\xa8|\xd7\xa4\xd6\xbc\xd7\xa8\xd7\x95\xd7\x91\xd7\x99\xd7\xa8\xd7\x9f|ki\xe1\xbb\x83m tra|\xc3\x96l\xc3\xa7ek|'
>>> print('utf-16    %r' % e16)
utf-16    b"\xff\xfeA\x00B\x00C\x00t\x00e\x00s\x00t\x00\xb2\x03\x9d\x8cTX\x04\xc7m\x00\xe1\x00s\x00b\x00\xea\x00t\x00a\x00|\x00t\x00e\x00s\x00t\x00|\x00'\x06.\x06*\x06(\x06'\x061\x06|\x00Km\xd5\x8b|\x00,nf\x8a|\x00\xc60\xb90\xc80|\x00*\t0\t@\t\x15\tM\t7\t>\t|\x00*\r0\r?\r6\rK\r'\r(\r|\x00\xe4\x05\xbc\x05\xe8\x05\xd5\x05\xd1\x05\xd9\x05\xe8\x05\xdf\x05|\x00k\x00i\x00\xc3\x1em\x00 \x00t\x00r\x00a\x00|\x00\xd6\x00l\x00\xe7\x00e\x00k\x00|\x00"
>>> print('utf-16le  %r' % e16le)
utf-16le  b"A\x00B\x00C\x00t\x00e\x00s\x00t\x00\xb2\x03\x9d\x8cTX\x04\xc7m\x00\xe1\x00s\x00b\x00\xea\x00t\x00a\x00|\x00t\x00e\x00s\x00t\x00|\x00'\x06.\x06*\x06(\x06'\x061\x06|\x00Km\xd5\x8b|\x00,nf\x8a|\x00\xc60\xb90\xc80|\x00*\t0\t@\t\x15\tM\t7\t>\t|\x00*\r0\r?\r6\rK\r'\r(\r|\x00\xe4\x05\xbc\x05\xe8\x05\xd5\x05\xd1\x05\xd9\x05\xe8\x05\xdf\x05|\x00k\x00i\x00\xc3\x1em\x00 \x00t\x00r\x00a\x00|\x00\xd6\x00l\x00\xe7\x00e\x00k\x00|\x00"
>>> print('utf-16be  %r' % e16be)
utf-16be  b"\x00A\x00B\x00C\x00t\x00e\x00s\x00t\x03\xb2\x8c\x9dXT\xc7\x04\x00m\x00\xe1\x00s\x00b\x00\xea\x00t\x00a\x00|\x00t\x00e\x00s\x00t\x00|\x06'\x06.\x06*\x06(\x06'\x061\x00|mK\x8b\xd5\x00|n,\x8af\x00|0\xc60\xb90\xc8\x00|\t*\t0\t@\t\x15\tM\t7\t>\x00|\r*\r0\r?\r6\rK\r'\r(\x00|\x05\xe4\x05\xbc\x05\xe8\x05\xd5\x05\xd1\x05\xd9\x05\xe8\x05\xdf\x00|\x00k\x00i\x1e\xc3\x00m\x00 \x00t\x00r\x00a\x00|\x00\xd6\x00l\x00\xe7\x00e\x00k\x00|"
>>> print()

>>> print('utf-8  w/ BOM decoded with utf-8     %r' % e8s.decode('utf-8'))
utf-8  w/ BOM decoded with utf-8     '\ufeffABCtestβ貝塔위másbêta|test|اختبار|测试|測試|テスト|परीक्षा|പരിശോധന|פּרובירן|kiểm tra|Ölçek|'
>>> print('utf-8  w/ BOM decoded with utf-8-sig %r' % e8s.decode('utf-8-sig'))
utf-8  w/ BOM decoded with utf-8-sig 'ABCtestβ貝塔위másbêta|test|اختبار|测试|測試|テスト|परीक्षा|പരിശോധന|פּרובירן|kiểm tra|Ölçek|'
>>> print('utf-16 w/ BOM decoded with utf-16    %r' % e16.decode('utf-16'))
utf-16 w/ BOM decoded with utf-16    'ABCtestβ貝塔위másbêta|test|اختبار|测试|測試|テスト|परीक्षा|പരിശോധന|פּרובירן|kiểm tra|Ölçek|'
>>> print('utf-16 w/ BOM decoded with utf-16le  %r' % e16.decode('utf-16le'))
utf-16 w/ BOM decoded with utf-16le  '\ufeffABCtestβ貝塔위másbêta|test|اختبار|测试|測試|テスト|परीक्षा|പരിശോധന|פּרובירן|kiểm tra|Ölçek|'

এটা তোলে এর মূল্য জানাতে চাই যে শুধুমাত্র উভয় utf-8-sigএবং utf-16উভয় পরে মূল স্ট্রিং ফিরে পেতে encodeএবং decode


-3

এই সমস্যাটি মূলত উত্থাপিত হয় যখন আপনি আপনার পাইথন কোডটি ইউটিএফ -8 বা ইউটিএফ -16 এনকোডিংয়ে সংরক্ষণ করেন কারণ কোডটি শুরু করার সময় অজগরটি স্বয়ংক্রিয়ভাবে কোডটির শুরুতে কিছু বিশেষ অক্ষর যুক্ত করে (যা পাঠ্য সম্পাদকদের দ্বারা প্রদর্শিত হয় না) এনকোডিং ফর্ম্যাটটি সনাক্ত করতে পারে। কিন্তু, যখন আপনি কোড আপনার লাইন 1 অর্থাৎ বাক্য গঠন ত্রুটি দেয় চালানো করার চেষ্টা করুন, কোডের শুরু কারণ পাইথন কম্পাইলার হওয়া ASCII এনকোডিং বুঝতে পারে । আপনি যখন পড়ার () ফাংশন ব্যবহার করে ফাইলের কোডটি দেখেন আপনি ফিরে আসা কোডটির শুরুতে দেখতে পাবেন 'fe উফ্ফ' প্রদর্শিত হবে। এই সমস্যার এক সহজ সমাধান হ'ল কেবল এনকোডিংটি ASCII এনকোডিংয়ে পরিবর্তন করে(এর জন্য আপনি আপনার কোডটি একটি নোটপ্যাডে অনুলিপি করতে পারেন এবং এটি সংরক্ষণ করতে পারেন মনে রাখবেন! ASCII এনকোডিং চয়ন করুন ... আশা করি এটি সাহায্য করবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.