পাইথন - 'আসকি' কোডেক বাইট ডিকোড করতে পারে না


119

আমি সত্যি বিভ্রান্ত. আমি এনকোড দেওয়ার চেষ্টা করেছি কিন্তু ত্রুটিটি বলেছে can't decode...

>>> "你好".encode("utf8")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)

আমি জানি যে স্ট্রিংয়ের "u" উপসর্গের সাথে ত্রুটিটি কীভাবে এড়াতে হবে। আমি কেবল ভাবছি যে এনকোড ডাকা হওয়ার সময় ত্রুটিটি "ডিকোড করতে পারে না" কেন। পাইথন হুডের নীচে কী করছে?

উত্তর:


167
"你好".encode('utf-8')

encodeএকটি ইউনিকোড অবজেক্টকে একটি stringঅবজেক্টে রূপান্তরিত করে । তবে এখানে আপনি এটি কোনও stringবস্তুর প্রতি অনুরোধ করেছেন (কারণ আপনার কাছে ইউ নেই)। সুতরাং পাইথনকে প্রথমে stringএকটি unicodeবস্তুতে রূপান্তর করতে হবে । সুতরাং এটি সমতুল্য করে

"你好".decode().encode('utf-8')

তবে ডিকোড ব্যর্থ হয়েছে কারণ স্ট্রিংটি বৈধ নয় ci এজন্য আপনি ডিকোড করতে সক্ষম না হওয়ায় অভিযোগ পান।


50
তাহলে সমাধান কি? বিশেষত আমার যদি স্ট্রিং আক্ষরিক না থাকে তবে আমার কাছে কেবল একটি স্ট্রিং অবজেক্ট রয়েছে।
জন তিরসন

2
@ জনটির্সন, আপনার কোনও স্ট্রিং অবজেক্ট এনকোড করা উচিত নয়। একটি স্ট্রিং অবজেক্ট ইতিমধ্যে এনকোড করা আছে। আপনার যদি এনকোডিং পরিবর্তন করতে হয় তবে আপনার এটিকে একটি ইউনিকোড স্ট্রিংয়ে ডিকোড করতে হবে এবং তারপরে এটি পছন্দসই এনকোডিং হিসাবে এনকোড করতে হবে।
উইনস্টন ইওয়ার্ট

20
সুতরাং উপরে থেকে স্পষ্টভাবে আপনি তা জানাতে পারেন"你好".decode('utf-8').encode('utf-8')
deinonychusaur

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

@ ডিজনিছুসার, হ্যাঁ ... আমি এটি পেয়েছি।
উইনস্টন ইওয়ার্ট

53

সর্বদা ইউনিকোড থেকে বাইটে এনকোড করুন
এই দিক থেকে, আপনি এনকোডিং চয়ন করতে পারেন

>>> u"你好".encode("utf8")
'\xe4\xbd\xa0\xe5\xa5\xbd'
>>> print _
你好

অন্য উপায়টি হ'ল বাইটগুলি থেকে ইউনিকোডে ডিকোড করা।
এই দিক থেকে, আপনাকে এনকোডিংটি কী তা জানতে হবে

>>> bytes = '\xe4\xbd\xa0\xe5\xa5\xbd'
>>> print bytes
你好
>>> bytes.decode('utf-8')
u'\u4f60\u597d'
>>> print _
你好

এই পয়েন্টটি যথেষ্ট চাপ দেওয়া যাবে না। আপনি যদি ইউনিকোড "হ্যাক-এ-মোল" খেলা এড়াতে চান তবে ডেটা স্তরে কী ঘটছে তা বোঝা গুরুত্বপূর্ণ। এখানে এটি অন্যভাবে ব্যাখ্যা করা হয়েছে:

  • একটি ইউনিকোড বস্তু ইতিমধ্যে ডিকোড হয়েছে, আপনি কখনই decodeএটি কল করতে চান না ।
  • একটি বাইস্টেরিং অবজেক্ট ইতিমধ্যে এনকোড হয়েছে, আপনি কখনই encodeএটিতে কল করতে চান না ।

এখন, .encodeএকটি বাইট স্ট্রিং দেখে পাইথন 2 প্রথমে স্পষ্ট করে এটি পাঠ্যে (কোনও unicodeবস্তু) রূপান্তরিত করার চেষ্টা করে । একইভাবে, .decodeএকটি ইউনিকোড স্ট্রিং দেখে পাইথন 2 স্পষ্টতই এটিকে বাইটে (কোনও strবস্তু) রূপান্তরিত করার চেষ্টা করে ।

এই অন্তর্নিহিত রূপান্তরগুলি হ'ল আপনি যখন ফোন করেছেন তখন কেন পাবেন । এর কারণ এনকোডিং সাধারণত টাইপের একটি প্যারামিটার গ্রহণ করে ; প্যারামিটারটি গ্রহণ করার সময় , অন্য কোনও এনকোডিংয়ের সাথে পুনরায় এনকোডিং করার আগে টাইপের কোনও অবজেক্টে একটি অন্তর্নিহিত ডিকোডিং থাকে । এই রূপান্তর একটি ডিফল্ট 'ASCII' ডিকোডার বেছে , একটি এনকোডার ভিতরে আপনি পাঠোদ্ধারতা ত্রুটি দেয়।UnicodeDecodeErrorencodeunicodestrunicode

আসলে, পাইথন 3-তে পদ্ধতি str.decodeএবং bytes.encodeএমনকি বিদ্যমান নেই। তাদের অপসারণ এই সাধারণ বিভ্রান্তি এড়ানোর একটি [বিতর্কিত] প্রচেষ্টা ছিল।

... বা কোডিং যা sys.getdefaultencoding()উল্লেখ করেছে; সাধারণত এটি 'আসকি'


সুতরাং আপনার অর্থ কি পাইথন এনকোডিংয়ের আগে বাইস্টেরিংটি ডিকোড করে?
থোসলিন

@ থসলিন ঠিক, আমি আরও বিশদ যুক্ত করেছি।
wim

_ কী, এবং আপনার মুদ্রণ বিবৃতি কেন বন্ধনী অনুপস্থিত?
NoBugs

1
আরপিএল-এ @ নোব্যাগস ১. _পূর্ববর্তী মান ২ বোঝায় because কারণ এটি একটি অজগর -২.২ প্রশ্ন।
wim

40

আপনি এটি চেষ্টা করতে পারেন

import sys
reload(sys)
sys.setdefaultencoding("utf-8")

অথবা

আপনি নিম্নলিখিত চেষ্টা করতে পারেন

আপনার .py ফাইলের শীর্ষে নীচের লাইনটি যুক্ত করুন।

# -*- coding: utf-8 -*- 

8

আপনি যদি পাইথন <3 ব্যবহার করেন তবে আপনাকে দোভাষীকে বলতে হবে যে আপনার স্ট্রিং আক্ষরিকটি ইউনিকোড এটির সাথে একটি উপসর্গ রেখেu :

Python 2.7.2 (default, Jan 14 2012, 23:14:09) 
[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> "你好".encode("utf8")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)
>>> u"你好".encode("utf8")
'\xe4\xbd\xa0\xe5\xa5\xbd'

আরও পড়ুন : ইউনিকোড হাওটো


4
আপনি যদি একটি স্ট্রিং এনকোড করছেন, এটি কেন একটি ডিকোড ত্রুটি ফেলে?
এমএক্সএলডিভস

3

আপনি u"你好".encode('utf8')একটি ইউনিকোড স্ট্রিং এনকোড করতে ব্যবহার করুন । আপনি যদি উপস্থাপন করতে চান তবে আপনার "你好"এটি ডিকোড করা উচিত। ঠিক যেমন:

"你好".decode("utf8")

আপনি যা চান তা পাবেন will হতে পারে আপনার এনকোড এবং ডিকোড সম্পর্কে আরও জানানো উচিত।


3

আপনি যদি ইউনিকোডের সাথে ডিল করছেন তবে মাঝে মাঝে পরিবর্তে encode('utf-8')আপনি বিশেষ অক্ষরগুলিও উপেক্ষা করার চেষ্টা করতে পারেন, যেমন

"你好".encode('ascii','ignore')

বা something.decode('unicode_escape').encode('ascii','ignore')এখানে পরামর্শ হিসাবে

এই উদাহরণে বিশেষভাবে কার্যকর নয়, তবে যখন কিছু বিশেষ অক্ষর রূপান্তর করা সম্ভব না হয় তখন অন্যান্য পরিস্থিতিতে আরও ভাল কাজ করতে পারে।

বিকল্পভাবে আপনি ব্যবহার করে নির্দিষ্ট অক্ষর প্রতিস্থাপনreplace() বিবেচনা করতে পারেন ।


1

আপনি যদি লিনাক্স বা অনুরূপ সিস্টেমে (বিএসডি, ম্যাক সম্পর্কে নিশ্চিত নন) অজগর দোভাষীটি শুরু করেন, তবে শেলের জন্য আপনার ডিফল্ট এনকোডিংও পরীক্ষা করা উচিত।

locale charmapশেল থেকে কল করুন (পাইথন ইন্টারপ্রেটার নয়) এবং আপনার দেখতে হবে

[user@host dir] $ locale charmap
UTF-8
[user@host dir] $ 

যদি এটি না হয় এবং আপনি অন্য কিছু দেখতে পান, যেমন

[user@host dir] $ locale charmap
ANSI_X3.4-1968
[user@host dir] $ 

পাইথন (কমপক্ষে কিছু ক্ষেত্রে যেমন খনিতে) শেলের এনকোডিংয়ের উত্তরাধিকারী হবে এবং ইউনিকোড অক্ষর (কিছু? সব?) মুদ্রণ করতে সক্ষম হবে না। পাইথনের নিজস্ব ডিফল্ট এনকোডিং যা আপনি দেখেন এবং এর মাধ্যমে নিয়ন্ত্রণ করেন sys.getdefaultencoding()এবং sys.setdefaultencoding()এই ক্ষেত্রে তা অবহেলিত।

যদি আপনি দেখতে পান যে আপনার এই সমস্যা রয়েছে তবে আপনি এটি ঠিক করতে পারেন

[user@host dir] $ export LC_CTYPE="en_EN.UTF-8"
[user@host dir] $ locale charmap
UTF-8
[user@host dir] $ 

(অথবা বিকল্পগুলির জন্য এন_এন এর পরিবর্তে যেকোন কী ম্যাপটি চয়ন করতে পারেন তা বেছে নিন)) এটিকে সংশোধন করতে আপনি সম্পাদনা করতে /etc/locale.conf(বা যে কোনও ফাইল আপনার সিস্টেমে লোকাল সংজ্ঞা পরিচালনা করে ) can

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