ইউনিকোডডেকোডেরর, অবৈধ ধারাবাহিকতা বাইট


257

নীচের আইটেমটি কেন ব্যর্থ হচ্ছে? এবং কেন এটি "ল্যাটিন -1" কোডেক দিয়ে সফল হয়?

o = "a test of \xe9 char" #I want this to remain a string as this is what I am receiving
v = o.decode("utf-8")

ফলাফল স্বরূপ:

 Traceback (most recent call last):  
 File "<stdin>", line 1, in <module>  
 File "C:\Python27\lib\encodings\utf_8.py",
 line 16, in decode
     return codecs.utf_8_decode(input, errors, True) UnicodeDecodeError:
 'utf8' codec can't decode byte 0xe9 in position 10: invalid continuation byte

উত্তর:


247

বাইনারি, 0xE9 দেখতে দেখতে 1110 1001। আপনি যদি উইকিপিডিয়ায় ইউটিএফ -8 সম্পর্কে পড়েন তবে আপনি দেখতে পাবেন যে এই জাতীয় বাইটটি অবশ্যই ফর্মের দুটি দ্বারা অনুসরণ করা উচিত 10xx xxxx। সুতরাং, উদাহরণস্বরূপ:

>>> b'\xe9\x80\x80'.decode('utf-8')
u'\u9000'

তবে এটি ব্যতিক্রমের কেবল যান্ত্রিক কারণ। এই ক্ষেত্রে, আপনার কাছে একটি স্ট্রিং রয়েছে যা লাতিন ১ এ প্রায় অবশ্যই এনকোডেড রয়েছে U

>>> u'\xe9'.encode('utf-8')
b'\xc3\xa9'
>>> u'\xe9'.encode('latin-1')
b'\xe9'

(দ্রষ্টব্য, আমি পাইথন 2 এবং 3 উপস্থাপনার মিশ্রণটি এখানে ব্যবহার করছি Py পাইথনের কোনও সংস্করণে ইনপুটটি বৈধ, তবে আপনার পাইথন ইন্টারপ্রেটারটি আসলে এইভাবে ইউনিকোড এবং বাইট উভয় স্ট্রিংই দেখানোর সম্ভাবনা কম))


2
ধন্যবাদ (এবং অন্য যে জবাব দিয়েছিল), আমি এই ভুল বিশ্বাসের মধ্যে ছিলাম যে 255 অবধি চরগুলি সরাসরি রূপান্তরিত হবে would
রুইডিসি

আমি UnicodeEncodeError: 'ascii' codec can't encode characters in position 2-3: ordinal not in range(128)ব্যবহার করতে ত্রুটি পেয়েছি.encode(latin-1)
শিব

234

আমি যখন পান্ডাস রিড_সিএসভি পদ্ধতিতে কোনও সিএসভি ফাইল খোলার চেষ্টা করেছি তখন আমারও একই ত্রুটি হয়েছিল।

সমাধানটি হ'ল এনকোডিংটিকে 'ল্যাটিন -১' এ পরিবর্তন করুন:

pd.read_csv('ml-100k/u.item', sep='|', names=m_cols , encoding='latin-1')

1
এটি কি আসলে সমস্যাটি সমাধান করে? এটি কি মূলত পান্ডাদের কম জটিল এনকোডিং শৈলীতে ডাউনগ্রেড করে বাইট উপেক্ষা করতে বলে না?
ইউ চেন

61

এটি অবৈধ ইউটিএফ -8। সেই চরিত্রটি হ'ল আইএসও-ল্যাটিন 1-এর ই-অ্যাকিউট চরিত্র, এ কারণেই এটি সেই কোডসেটটি সাফল্য লাভ করে।

আপনি যদি কোডসেটটি না জানেন তবে আপনি স্ট্রিংগুলি পেয়ে যাচ্ছেন তবে আপনি কিছুটা সমস্যায় পড়েছেন। আপনার প্রোটোকল / অ্যাপ্লিকেশনের জন্য যদি একটি একক কোডসেট (আশা করি ইউটিএফ -8) চয়ন করা হয় তবে এটি সর্বোত্তম হবে এবং তারপরে আপনি যেগুলি ডিকোড করেননি কেবল তা প্রত্যাখাত করবেন।

যদি আপনি এটি করতে না পারেন তবে আপনার জন্য হিরিস্টিক্স দরকার।


2
এবং হিউরিস্টিক্সের জন্য, চারডেট লাইব্রেরি দেখুন।
mlissner

44

কারণ ইউটিএফ -8 মাল্টিবাইট এবং আপনার \xe9প্লাস নিম্নলিখিত স্থানের সংমিশ্রনের সাথে মিলিত কোনও চর নেই ।

কেন এটি utf-8 এবং ল্যাটিন -1 উভয় ক্ষেত্রেই সফল হবে ?

এখানে কীভাবে একই বাক্যটি utf-8 এ হওয়া উচিত:

>>> o.decode('latin-1').encode("utf-8")
'a test of \xc3\xa9 char'

ল্যাটিন -১ একটি একক বাইট এনকোডিং পরিবার তাই এর প্রত্যেকটি জিনিস ইউটিএফ -8 এ সংজ্ঞায়িত করা উচিত। তবে কেন কোথাও ল্যাটিন -১ জিতেছে?
রেহান_আমন

11

সবে খোলা একটি ফাইল ম্যানিপুলেট করার সময় যদি এই ত্রুটি দেখা দেয়, আপনি এটি 'rb'মোডে খোলেন কিনা তা পরীক্ষা করে দেখুন


2
এই উত্তরের জন্য ধন্যবাদ, ইউনিকোডডাইকোডেরর এররটি এড়াতে সক্ষম হয়েছিল : 'utf-8' কোডেক 20x4079 পজিশনে 0xd7 বাইট ডিকোড করতে পারে না: অবৈধ ধারাবাহিকতা বাইট দ্বারা soup = BeautifulSoup(open('webpage.html', 'rb'), 'html.parser')
আইজাক ফিলিপ

6

আমার সাথেও এটি ঘটেছিল, যখন আমি একটি .txtফাইল থেকে হিব্রু সম্বলিত পাঠটি পড়ছিলাম ।

আমি ক্লিক করেছি: file -> save asএবং আমি এই ফাইলটিকে একটি UTF-8এনকোডিং হিসাবে সংরক্ষণ করেছি


5

utf-8 কোড ত্রুটি সাধারণত তখন আসে যখন 0 থেকে 127 এর বেশি সংখ্যার মানগুলির পরিসীমা।

এই ব্যতিক্রমটি বাড়ানোর কারণটি হ'ল:

1) কোড পয়েন্ট যদি <128 হয় তবে প্রতিটি বাইট কোড পয়েন্টের মান হিসাবে সমান। ২) কোড পয়েন্টটি যদি 128 বা তার বেশি হয় তবে ইউনিকোড স্ট্রিংটি এই এনকোডিংটিতে প্রতিনিধিত্ব করা যাবে না। (পাইথন এক্ষেত্রে একটি ইউনিকোড এনকোডেরর ব্যতিক্রম উত্থাপন করে))

এটি কাটিয়ে উঠতে আমাদের কাছে এনকোডিংগুলির একটি সেট রয়েছে, সর্বাধিক ব্যবহৃত হয় "ল্যাটিন -1, এটি আইএসও -8859-1" নামেও পরিচিত

সুতরাং আইএসও-8859-1 ইউনিকোড পয়েন্ট 0-255 ল্যাটিন -1 মানগুলির সাথে সমান, তাই এই এনকোডিংয়ে রূপান্তরকরণের জন্য কেবল কোড পয়েন্টগুলি বাইট মানগুলিতে রূপান্তর করা প্রয়োজন; যদি 255 এর চেয়ে বড় কোনও কোড পয়েন্ট সম্মুখীন হয়, তবে স্ট্রিংটি লাতিন -1 এ এনকোড করা যাবে না

আপনি যখন কোনও ডেটা সেট লোড করার চেষ্টা করছেন তখন এই ব্যতিক্রম ঘটে যখন এই ফর্ম্যাটটি ব্যবহার করার চেষ্টা করুন

df=pd.read_csv("top50.csv",encoding='ISO-8859-1')

সিনট্যাক্সের শেষে এনকোডিং কৌশল যুক্ত করুন যা ডেটা সেটটি লোড করতে গ্রহণ করে।


হাই এবং তাই আপনাকে স্বাগতম! এই প্রশ্নের ইতিমধ্যে উপস্থিত অন্যান্য উত্তরের উপর এটি উন্নত হয় তা নিশ্চিত করার জন্য দয়া করে আপনার উত্তরটি সম্পাদনা করুন।
হংসসি


-1

এই ক্ষেত্রে, আমি একটি .py চালানোর চেষ্টা করেছি যা একটি পথ / file.sql সক্রিয় করে।

আমার সমাধানটি ছিল ফাইল.এসকিউএল-এর কোডিংটি "বিওএম ছাড়াই ইউটিএফ -8" তে পরিবর্তন করা এবং এটি কার্যকর!

আপনি এটি নোটপ্যাড ++ দিয়ে করতে পারেন।

আমি আমার কোডের একটি অংশ রেখে দেব

/ কোড /

কন = সাইকোপজি ২.কনেক্ট (হোস্ট = সিস.আরজিভি [১], পোর্ট = এসআইএসভিভি [২], ডিবি নাম = সিএস.আরজিভি [৩], ব্যবহারকারী = সিএস.আরজিভি [৪], পাসওয়ার্ড = সিএস.আরজিভি [৫] )

কার্সার = কনকুরসার () স্ক্লোফাইল = খোলা (পথ, 'আর')

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