ইউনিকোডএকোডএরর: 'এসকিআই' কোডেক আপনি অক্ষরের এনকোড করতে পারবেন না '\ xa0' পজিশনে: সীমাবদ্ধ নয় (128)


1295

বিভিন্ন ওয়েব পৃষ্ঠা (বিভিন্ন সাইটে) থেকে প্রাপ্ত পাঠ্য থেকে ইউনিকোড অক্ষরগুলি নিয়ে আমার সমস্যা হচ্ছে। আমি বিউটিফুলসপ ব্যবহার করছি।

সমস্যাটি হ'ল ত্রুটিটি সর্বদা পুনরুত্পাদনযোগ্য হয় না; এটি কখনও কখনও কিছু পৃষ্ঠাগুলির সাথে কাজ করে এবং কখনও কখনও এটি নিক্ষেপ করে বাধা দেয় UnicodeEncodeError। আমি যা ভাবতে পারি সে সম্পর্কে কেবল চেষ্টা করেছি এবং এখনও কোনওরকম ইউনিকোড-সম্পর্কিত ত্রুটি না ফেলেই ধারাবাহিকভাবে কাজ করে এমন কিছুই পাইনি।

কোড তৈরির একটি বিভাগ যা সমস্যার সৃষ্টি করছে তা নীচে দেখানো হয়েছে:

agent_telno = agent.find('div', 'agent_contact_number')
agent_telno = '' if agent_telno is None else agent_telno.contents[0]
p.agent_info = str(agent_contact + ' ' + agent_telno).strip()

উপরের স্নিপেটটি চালানো হলে এখানে কয়েকটি স্ট্রিংয়ে স্ট্যাক ট্রেস উত্পাদিত হয়:

Traceback (most recent call last):
  File "foobar.py", line 792, in <module>
    p.agent_info = str(agent_contact + ' ' + agent_telno).strip()
UnicodeEncodeError: 'ascii' codec can't encode character u'\xa0' in position 20: ordinal not in range(128)

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

কীভাবে এই সমস্যাটি সমাধান করবেন সে সম্পর্কে কারও কি কোনও ধারণা রয়েছে যাতে আমি এই সমস্যাটি বোধহয় সমাধান করতে পারি?


1
আপনি যদি এই ত্রুটিগুলি একজন ডেভেলপার হিসাবে না হয়ে ব্যবহারকারী হিসাবে পেয়ে থাকেন তবে সার্ভারফল্ট / প্রশ্ন
ব্রাজিলিয়ান গাই

আমি এই পয়েন্টটি যুক্ত করব এই জিনিসগুলির জন্য অনলাইন gdb.com/online_python_interpreter ব্যবহার করবেন না । সেই দোভাষীকে পরীক্ষার স্টাফ আউট করার জন্য ব্যবহার করছিল এবং এটি ইউনিকোডের জন্য সঠিকভাবে কনফিগার করা হয়নি! সর্বদা 'বি' \ nnn '' ফর্ম্যাটে মুদ্রণ করতাম ... যখন আমি চেয়েছিলাম সবই ছিল গিলিমেট! একটি ভিএম-তে চেষ্টা করা হয়েছিল এবং এটি
সিআর

4
এই চেষ্টা করুন import os; import locale; os.environ["PYTHONIOENCODING"] = "utf-8"; myLocale=locale.setlocale(category=locale.LC_ALL, locale="en_GB.UTF-8"); ... print(myText.encode('utf-8', errors='ignore'))
এইচ এইচ

@hhh আমি আপনার স্নিপেট চালিয়েছি নেম এরর: নাম 'মাই টেক্সট' সংজ্ঞায়িত করা হয়নি
KHAN ইরফান

9
আপনার স্ক্রিপ্টটি সম্পাদন করার আগে শেলটিতে পাইথনিওনডিং সেট করার চেষ্টা করুন :$ export PYTHONIOENCODING=utf8
নোয়াম মানস

উত্তর:


1361

আপনাকে পাইথন ইউনিকোড হাওটো পড়তে হবে । এই ত্রুটিটি প্রথম উদাহরণ

মূলত, ব্যবহার বন্ধ করুন str ইউনিকোড থেকে এনকোডযুক্ত পাঠ্য / বাইটে রূপান্তর করতে ।

পরিবর্তে, .encode()স্ট্রিংটি এনকোড করতে সঠিকভাবে ব্যবহার করুন :

p.agent_info = u' '.join((agent_contact, agent_telno)).encode('utf-8').strip()

অথবা ইউনিকোডে পুরোপুরি কাজ করুন।


23
রাজি! আমাকে থাম্বের একটি ভাল নিয়ম শেখানো হয়েছিল "ইউনিকোড স্যান্ডউইচ" ধারণাটি ব্যবহার করা। আপনার স্ক্রিপ্ট বাইরের বিশ্ব থেকে বাইট গ্রহণ করে, তবে সমস্ত প্রক্রিয়াজাতীয়টি ইউনিকোডে করা উচিত। আপনি যখন নিজের ডেটা আউটপুট করতে প্রস্তুত হন কেবল তখনই এটি আবার বাইটে মিশ্রিত করা উচিত!
অ্যান্ডব্রিডু

255
যদি অন্য কেউ এতে বিভ্রান্ত হয় তবে আমি একটি অদ্ভুত জিনিস পেয়েছি: আমার টার্মিনালটি utf-8 ব্যবহার করে এবং যখন আমি printআমার utf-8 স্ট্রিংটি এটি সুন্দরভাবে কাজ করে। তবে আমি যখন আমার প্রোগ্রামগুলিকে কোনও ফাইলে আউটপুট পাইপ করি তখন এটি একটি নিক্ষেপ করে UnicodeEncodeError। আসলে, যখন আউটপুটটি পুনর্নির্দেশ করা হয় (কোনও ফাইল বা পাইপে) তখন আমি তা sys.stdout.encodingদেখতে পাই None! উপর নজর রাখা সমস্যার .encode('utf-8')সমাধান করে।
ড্রভিকো

93
@ ড্রেভিকো: PYTHONIOENCODING=utf-8পরিবর্তে ব্যবহার করুন, ইউনিকোড স্ট্রিংগুলি মুদ্রণ করুন এবং পরিবেশটিকে প্রত্যাশিত এনকোডিং সেট করতে দিন।
jfs

1
@ স্টেইনার: প্রতিটি ক্ষেত্রে কিছুই বৈধ নয়। সাধারণভাবে, ব্যবহারকারীর উচিত নয় যে আপনি আপনার ইউটিলিটি বাস্তবায়নের জন্য পাইথনটি ব্যবহার করেন (যদি আপনি কোনও কারণেই অন্য ভাষায় পুনরায় প্রয়োগের সিদ্ধান্ত নেন তবে ইন্টারফেসটি পরিবর্তন করা উচিত নয়) এবং সেইজন্য আপনাকে পাইথন সম্পর্কে সচেতন হওয়া উচিত নয়- নির্দিষ্ট envvars। ব্যবহারকারীর অক্ষর এনকোডিং নির্দিষ্ট করতে বাধ্য করা খারাপ UI; প্রয়োজনে প্রতিবেদন বিন্যাসে অক্ষর এনকোডিং এম্বেড করুন। দ্রষ্টব্য: সাধারণ ক্ষেত্রে কোনও হার্ডকোডযুক্ত এনকোডিং "বুদ্ধিমান ডিফল্ট" হতে পারে না।
jfs

13
এটি খারাপ এবং বিভ্রান্তিকর পরামর্শ। লোকেরা স্ট্র্যাম ব্যবহার করার কারণ হ'ল বস্তুটি ইতিমধ্যে একটি স্ট্রিং নয়, সুতরাং .encode()কল করার কোনও পদ্ধতি নেই ।
সেরিন

433

এটি একটি ক্লাসিক অজগর ইউনিকোড ব্যথা পয়েন্ট! নিম্নোক্ত বিবেচনা কর:

a = u'bats\u00E0'
print a
 => batsà

এখন পর্যন্ত সমস্ত ভাল, তবে আমরা স্ট্রিং (ক) বলি, তবে কী ঘটে তা দেখা যাক:

str(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe0' in position 4: ordinal not in range(128)

ওহ ডুব, এটা কারও ভাল কিছু করবে না! ত্রুটিটি সমাধান করতে, বাইনসকে স্পষ্টভাবে এনকোড দিয়ে এনকোড করুন এবং কী কোডেক ব্যবহার করবেন তা পাইথনকে বলুন:

a.encode('utf-8')
 => 'bats\xc3\xa0'
print a.encode('utf-8')
 => batsà

Voil \ u00E0!

সমস্যাটি হ'ল আপনি যখন আরআর () কল করেন তখন পাইথন ডিফল্ট অক্ষর এনকোডিংটি ব্যবহার করে আপনি যে বাইটগুলি দিয়েছিলেন তা এনকোড করতে ব্যবহার করে যা আপনার ক্ষেত্রে ইউনিকোডের অক্ষরের প্রতিনিধিত্ব করে। সমস্যা সমাধানের জন্য, আপনাকে অজগরকে বলতে হবে যে আপনি .encode ('যাইহোক_উনিকোড') ব্যবহার করে আপনি যে স্ট্রিংটি দিয়েছেন তার সাথে কীভাবে ডিল করবেন। বেশিরভাগ সময়, আপনি utf-8 ব্যবহার করে ভাল থাকতে হবে।

এই বিষয়ে একটি চমৎকার প্রদর্শন করার জন্য, নেড ব্যাচেল্ডারের পাইকন আলাপ এখানে দেখুন: http://nedbatchelder.com/text/unipain.html


85
ব্যক্তিগত দ্রষ্টব্য: ".এনকোড" দুর্ঘটনাক্রমে ".unicode" টাইপ করার চেষ্টা করার পরে কেন কিছুই কাজ করছে না তা অবাক করুন।
হাফম্যান

9
সদুপদেশ. তবে আপনি যখন স্ট্রিং হতে পারে বা নাও হতে পারে এমন জিনিসগুলি মুদ্রণের জন্য str (x) ব্যবহার করছিলেন তখন আপনি তার পরিবর্তে কী করবেন? x (সংখ্যা), সংখ্যা, তারিখের সময়, বুলিয়ান বা সাধারণ স্ট্রিং হলে str (x) কাজ করে। হঠাৎ যদি এটির একটি ইউনিকোড এটি কাজ করা বন্ধ করে দেয়। একই আচরণ করার কোনও উপায় আছে বা বস্তুটি .encode, এবং str () অন্যথায় ব্যবহার করতে স্ট্রিং করছে কিনা তা পরীক্ষা করার জন্য এখন আমাদের যদি আইফ চেক যুক্ত করা দরকার?
ডার্ক আর

একই প্রশ্ন Noneমান সহ জিজ্ঞাসা করা যেতে পারে ।
ভাদোরকোয়েস্ট

210

আমি প্রতীকগুলি সরাতে এবং স্ট্রিংটিকে নিম্নরূপে স্ট্রিংটি চালিয়ে যেতে আমার চারপাশে মার্জিত কাজ খুঁজে পেয়েছি:

yourstring = yourstring.encode('ascii', 'ignore').decode('ascii')

এটি লক্ষ্য করা গুরুত্বপূর্ণ যে উপেক্ষা করা বিকল্পটি ব্যবহার করা বিপজ্জনক কারণ এটি নীতিহীনভাবে কোনও ইউনিকোড (এবং আন্তর্জাতিকীকরণ) কোড ব্যবহার করে যে কোডটি ব্যবহার করে, এটি এখানে (ইউনিকোড রূপান্তরিত) হিসাবে দেখায়:

>>> u'City: Malmö'.encode('ascii', 'ignore').decode('ascii')
'City: Malm'

17
আপনি আমার দিন তৈরি! UF-8 এর জন্য এটি করা যথেষ্ট:yourstring = yourstring.encode('utf-8', 'ignore').decode('utf-8')
luca76

আমার জন্য এটি কাজ করেছে তবে আমার কেসটি আলাদা ছিল, আমি ফাইলের নাম সংরক্ষণ করছিলাম এবং নামটিতে "/" ছিলাম এবং পথটির অস্তিত্ব ছিল না তাই আমাকে .replace ("/", "") ব্যবহার করতে হবে এবং এভাবে সংরক্ষণ করা হয়েছে আমার স্ক্রিপ্ট আসকি উপেক্ষা করার সময় 'ইউটিএফ -8' কেসও কাজ করে।
আকাশ কান্দপাল

1
ফাইলের পাথগুলি সঠিকভাবে ব্যবহারের জন্য @ হ্যারিপোটটার0 os.path.join(), যখন আপনি ক্রস-প্ল্যাটফর্ম প্রোগ্রামিং শুরু করেন তখন এটি খুব ভাল অভ্যাস। :)
লগইন_ন_টেল

152

আমি সবকিছু চেষ্টা করেছিলাম কিন্তু এটি কার্যকর হয়নি, চারপাশে গুগল করার পরে আমি নিম্নলিখিতটি বুঝলাম এবং এটি সাহায্য করেছিল। পাইথন ২.7 ব্যবহৃত হয়।

# encoding=utf8
import sys
reload(sys)
sys.setdefaultencoding('utf8')

7
এটি করবেন না। আপনি যখন ত্রুটিটি অনুসন্ধান করেন ফলাফলের শীর্ষে কাছে যখন আপনার কাছে এই স্ট্যাকওভারফ্লো.com/a/31137935/2141635 এর মতো উত্তর থাকে তবে stackoverflow.com/questions/3828723/… , যদিও এটিকে কেন ভাল ধারণা বলে মনে হতে পারে তা দেখতে পাচ্ছি।
প্যাডেরিক কানিংহাম

21
আমি এই বিষয়ে প্রায় সমস্ত পরামর্শ চেষ্টা করেছিলাম এবং সত্যই আমার পক্ষে কাজ করে নি। অবশেষে আমি এটি চেষ্টা করেছিলাম। এবং এটি কেবলমাত্র সহজ এবং ভাল কাজ করেছে one কেউ বলে "এটা করো না, তাহলে একটি সহজ সমাধান সঙ্গে আসা অন্যথায় এই একটি ব্যবহার কারণ এটি একটি ভাল কাজ কপি এবং অতীত
রিচার্ড ডি Ree

4
পাইথন 3 এ এটি কীভাবে করা যায়? জেনে খুশি হবেন।
কানার্ভা পিটার

3
এত হতাশার পরে এই কাজ করলেন। একটি গুচ্ছ ধন্যবাদ।
অব্রাহাম ঝুরবা

4
আমি কেবল একটি যুক্ত করবif sys.version_info.major < 3:
অধ্যাপক ফ্যালকেন চুক্তি

87

এমনকি মুদ্রণটিকে ব্যর্থ করতে পারে এমন একটি সূক্ষ্ম সমস্যা হ'ল আপনার পরিবেশের ভেরিয়েবলগুলি ভুল সেট করা eg এখানে এলসি_এলএল "সি" তে সেট করুন। দেবিয়ান ভাষায় তারা এটি সেট করতে নিরুৎসাহিত করে: লোকালে ডেবিয়ান উইকি

$ echo $LANG
en_US.utf8
$ echo $LC_ALL 
C
$ python -c "print (u'voil\u00e0')"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe0' in position 4: ordinal not in range(128)
$ export LC_ALL='en_US.utf8'
$ python -c "print (u'voil\u00e0')"
voilà
$ unset LC_ALL
$ python -c "print (u'voil\u00e0')"
voilà

ঠিক একই সমস্যা পেয়েছি, এত খারাপ আমি রিপোর্ট করার আগে এটি পরীক্ষা করে দেখিনি । অনেক ধন্যবাদ. যাইহোক, আপনি প্রথম দুটি কমান্ড এর সাথে প্রতিস্থাপন করতে পারেন env|grep -E '(LC|LANG)'
দিমিত্রি ভারহাতুরভ

ভুল এনকোডিংয়ের বিষয়ে আমার দুটি সেন্ট। আমি প্রায়শই ব্যবহার mc"subshell ধরণ" (ইন Ctrl-O) এবং আমিও ভুলে গেছি যে আমি ব্যাশ নিম্নলিখিত ওরফে আরো বলেন: alias mc="LANG=en_EN.UTF-8 mc"। সুতরাং যখন আমি খারাপভাবে লিখিত স্ক্রিপ্টগুলি চালানোর চেষ্টা করেছি যা ru_RU.UTF-8অভ্যন্তরীণভাবে নির্ভর করে , তখন তারা মারা যায়। আমি আসল সমস্যাটি আবিষ্কার করার আগে এই থ্রেড থেকে প্রচুর স্টাফ চেষ্টা করেছি। :)
22:58

তুমি অসাধারণ. জিএসটিআইএলে, আমার আরএসসিএনসি ঠিক এই সমস্যার কারণে ব্যর্থ হয়েছিল। এলসি_এলএল স্থির করে এবং মদ হিসাবে সমস্ত কিছুই কাজ করে works <3 আপনাকে <3
ডিজাইনার

27

আমার জন্য, যা কাজ করেছিল তা ছিল:

BeautifulSoup(html_text,from_encoding="utf-8")

আশা করি এটি কাউকে সাহায্য করবে।


25

আমি প্রকৃতপক্ষে খুঁজে পেয়েছি যে আমার বেশিরভাগ ক্ষেত্রে এই চরিত্রগুলি সরিয়ে দেওয়া অনেক সহজ:

s = mystring.decode('ascii', 'ignore')

26
"পারফেক্টলি" সাধারণত এটি সম্পাদন করে না। এটি এমন স্টাফ ফেলে দেয় যা আপনার কীভাবে সঠিকভাবে মোকাবেলা করতে হবে তা নির্ধারণ করা উচিত।
ট্রিপলি

7
কেবল "সেই" (অ-ইংরাজী) অক্ষরগুলি সরিয়ে দেওয়া সমাধান নয় কারণ পাইথনকে অবশ্যই সমস্ত ভাষাগুলি সমর্থন করা উচিত যা আপনি ভাবেন না?
আলেমল

8
Downvoted। এটি মোটেই সঠিক সমাধান নয়। ইউনিকোডের সাথে কীভাবে কাজ করবেন তা শিখুন: joelonsoftware.com/articles/Unicode.html
অ্যান্ড্রু ফেরিয়ার

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

5
যদি আমি কোনও স্ক্রিপ্ট লিখছি যা কেবলমাত্র অভ্যন্তরীণ সংস্থার অ্যাপ্লিকেশনটিতে ইংরেজি পাঠ্য প্রবন্ধের জন্য প্রিন্ট করা দরকার তবে আমি চাই সমস্যাটি সরিয়ে দেওয়া। যাই হোক না কেন কাজ করে.
কেগ্রোনিক

25

সমস্যাটি হ'ল আপনি একটি ইউনিকোড অক্ষর মুদ্রণের চেষ্টা করছেন তবে আপনার টার্মিনাল এটি সমর্থন করে না।

language-pack-enএটি ঠিক করতে আপনি প্যাকেজ ইনস্টল করার চেষ্টা করতে পারেন :

sudo apt-get install language-pack-en

যা সমস্ত সমর্থিত প্যাকেজগুলির জন্য পাইথন সহ ইংরেজী অনুবাদ ডেটা আপডেট সরবরাহ করে। প্রয়োজনে বিভিন্ন ভাষা প্যাকেজ ইনস্টল করুন (আপনি যে অক্ষরগুলি মুদ্রণের চেষ্টা করছেন তা নির্ভর করে)।

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

তারপরে কোডটি লেখার সময় নিশ্চিত হয়ে নিন যে আপনি আপনার কোডটিতে সঠিক এনকোডিংটি ব্যবহার করেছেন।

উদাহরণ স্বরূপ:

open(foo, encoding='utf-8')

আপনার যদি এখনও সমস্যা হয় তবে আপনার সিস্টেম কনফিগারেশনটি ডাবল পরীক্ষা করুন, যেমন:

  • আপনার স্থানীয় ফাইল ( /etc/default/locale), যেমন থাকতে হবে

    LANG="en_US.UTF-8"
    LC_ALL="en_US.UTF-8"

    বা:

    LC_ALL=C.UTF-8
    LANG=C.UTF-8
  • শেলের মান LANG/LC_CTYPE

  • আপনার শেলটি কোন লোকেল সমর্থন করে তা পরীক্ষা করুন:

    locale -a | grep "UTF-8"

তাজা ভিএম-তে সমস্যা এবং সমাধানটি প্রদর্শন করা।

  1. ভিএম শুরু করুন এবং সরবরাহ করুন (যেমন ব্যবহার করা vagrant):

    vagrant init ubuntu/trusty64; vagrant up; vagrant ssh

    দেখুন: প্রাপ্তিসাধ্য উবুন্টু বক্স

  2. ইউনিকোড অক্ষর মুদ্রণ করা (যেমন ট্রেড চিহ্নের চিহ্ন হিসাবে ):

    $ python -c 'print(u"\u2122");'
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
    UnicodeEncodeError: 'ascii' codec can't encode character u'\u2122' in position 0: ordinal not in range(128)
  3. এখন ইনস্টল করা language-pack-en:

    $ sudo apt-get -y install language-pack-en
    The following extra packages will be installed:
      language-pack-en-base
    Generating locales...
      en_GB.UTF-8... /usr/sbin/locale-gen: done
    Generation complete.
  4. এখন সমস্যার সমাধান করা উচিত:

    $ python -c 'print(u"\u2122");'
    
  5. অন্যথায়, নিম্নলিখিত কমান্ড চেষ্টা করুন:

    $ LC_ALL=C.UTF-8 python -c 'print(u"\u2122");'
    

1
language-pack-enপাইথন বা এই প্রশ্নের সাথে কী করতে হবে? আফাইক, এটি বার্তাগুলিতে ভাষা অনুবাদ সরবরাহ করতে পারে তবে এনকোডিংয়ের সাথে কিছুই করার নেই
অ্যালাস্টার ম্যাককর্ম্যাক

2
কিছু লিনাক্স বিতরণে ডিফল্ট ইংলিশ লোকেলগুলি সঠিকভাবে সেট আপ করা হয়েছে তা নিশ্চিত করার জন্য এটি প্রয়োজন, বিশেষত টার্মিনালে পাইথন স্ক্রিপ্ট চলাকালীন। এটি এক পর্যায়ে আমার পক্ষে কাজ করেছিল। দেখুন: অক্ষর এনকোডিং
কেনারব

আহ, ঠিক আছে. আপনি বোঝাতে চাইছেন যদি আপনি একটি অ-ইংরাজী লোকেল ব্যবহার করতে চান? আমি অনুমান করি যে ব্যবহারকারীর /etc/locale.genব্যবহারের আগে তাদের লোকেলটি নির্মিত হয়েছে তা নিশ্চিত করতে সম্পাদনা করতে হবে?
অ্যালাস্টার ম্যাককর্ম্যাক

1
@AlastairMcCormack আউট মন্তব্য LANGথেকে /etc/default/locale(যেমন /etc/locale.genএবং দৌড়ে does't থাকবেই) locale-gen, কিন্তু এটা না সাহায্য। আমি language-pack-enঠিক কি করি তা নিশ্চিত নই , কারণ আমি খুব বেশি ডকুমেন্টেশন পাইনি এবং এর লিখিত সামগ্রীর তালিকা তৈরি করায় খুব বেশি সুবিধা হয় না।
কেনারব

1
ইতোমধ্যে কোনও ডেস্কটপ সিস্টেমে utf-8 লোকেল নেই বলে মনে হয়, সম্ভবত আপনাকে LANG/ LC_CTYPE/ এর LC_ALLপরিবর্তে (যেমন, LANG=C.UTF-8) কনফিগার করার দরকার নেই ।
jfs

19

আবরণের ভেতরে:

  1. নিম্নলিখিত কমান্ড দ্বারা সমর্থিত ইউটিএফ -8 স্থানীয় সন্ধান করুন:

    locale -a | grep "UTF-8"
  2. স্ক্রিপ্ট চালানোর আগে এটি রফতানি করুন, যেমন:

    export LC_ALL=$(locale -a | grep UTF-8)

    বা ম্যানুয়ালি পছন্দ করুন:

    export LC_ALL=C.UTF-8
  3. বিশেষ অক্ষর মুদ্রণ করে এটি পরীক্ষা করুন, যেমন :

    python -c 'print(u"\u2122");'

উবুন্টুতে উপরে পরীক্ষিত।


হ্যাঁ এটি সর্বোত্তম সংক্ষিপ্ত উত্তর, আমরা .encode
Luat Nguyen - Neo.Mxn0

16

আপনার স্ক্রিপ্টের শুরুতে নীচে লাইন যুক্ত করুন (বা দ্বিতীয় লাইন হিসাবে):

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

পাইথন সোর্স কোড এনকোডিংয়ের এটি সংজ্ঞা। পিইপি 263 এ আরও তথ্য ।


2
বাহ্যিক ফাইল থেকে লোড করা প্রক্রিয়াজাত পাঠ্যে utf-8 এনকোডিং থাকে যখন এটি সমস্যার সমাধান করে না। এটি কেবলমাত্র পাইথন স্ক্রিপ্টে লিখিত অক্ষরগুলির জন্যই সহায়তা করে এবং পাইথন ইন্টারপ্রেটারের জন্য এটি কেবল একটি সূত্র, তবে পাঠ্য প্রক্রিয়াজাতকরণে কোনও প্রভাব ফেলেনি।
মিকায়েলব্লমকভিস্টসন

16

এখানে আরও কিছু তথাকথিত "কপ আউট" উত্তরগুলির পুনঃস্থাপন করা হচ্ছে। এখানে এমন কিছু পরিস্থিতি রয়েছে যেখানে প্রতিবাদের প্রতিবাদ জানানো সত্ত্বেও কেবল ঝামেলা চরিত্রগুলি / স্ট্রিংগুলি ফেলে দেওয়া ভাল সমাধান।

def safeStr(obj):
    try: return str(obj)
    except UnicodeEncodeError:
        return obj.encode('ascii', 'ignore').decode('ascii')
    except: return ""

এটি পরীক্ষা করা:

if __name__ == '__main__': 
    print safeStr( 1 ) 
    print safeStr( "test" ) 
    print u'98\xb0'
    print safeStr( u'98\xb0' )

ফলাফল:

1
test
98°
98

পরামর্শ: আপনি সম্ভবত এই ফাংশনটির নাম রাখতে চান toAscii? এটি পছন্দ করার বিষয়।

এটি পাইথন ২ এর জন্য লেখা হয়েছিল , পাইথন 3 এর জন্য, আমি বিশ্বাস করি আপনি এর bytes(obj,"ascii")চেয়ে বেশি ব্যবহার করতে চাইবেনstr(obj) । আমি এটি এখনও পরীক্ষা করি নি, তবে আমি কোনও সময়ে উত্তরটি সংশোধন করব।


8

আমি সবসময় পাইথন ফাইলগুলির প্রথম দুটি লাইনে কোডটি নীচে রেখেছি:

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

6

এখানে সাধারণ সহায়ক ফাংশন পাওয়া যায় ।

def safe_unicode(obj, *args):
    """ return the unicode representation of obj """
    try:
        return unicode(obj, *args)
    except UnicodeDecodeError:
        # obj is byte string
        ascii_text = str(obj).encode('string_escape')
        return unicode(ascii_text)

def safe_str(obj):
    """ return the byte string representation of obj """
    try:
        return str(obj)
    except UnicodeEncodeError:
        # obj is unicode
        return unicode(obj).encode('unicode_escape')

(ASCII এনকোডিং ব্যবহার বাইট নির্বিচারে ইউনিকোড স্ট্রিং রূপান্তর করতে), আপনি ব্যবহার করতে পারে bytestring পলান পেতে backslashreplaceত্রুটি হ্যান্ডলার সঠিক নয়: u'\xa0'.encode('ascii', 'backslashreplace')। যদিও আপনার যেমন উপস্থাপনা এড়ানো উচিত এবং পরিবর্তে অ-এসিআই চরিত্রগুলি গ্রহণ করার জন্য আপনার পরিবেশকে কনফিগার করা উচিত - এটি 2016!
jfs

শুভ নববর্ষ @ জেএফএসবেস্তিয়ান। আমি কেবল পাইথন-ইউনিকোড ইস্যুতে হতাশ হয়েছি এবং অবশেষে এই সমাধানটি কার্যকর হয়েছিল যা কাজ করছে। আমি এই সম্পর্কে জানতাম না। যাইহোক টিপ জন্য ধন্যবাদ।
প্যারাগ ত্যাগী -আমরাফিয়াস-


4

টার্মিনালটি খুলুন এবং নীচের কমান্ডটি ফায়ার করুন:

export LC_ALL="en_US.UTF-8"

3

আমি কেবল নিম্নলিখিতটি ব্যবহার করেছি:

import unicodedata
message = unicodedata.normalize("NFKD", message)

এটি সম্পর্কে ডকুমেন্টেশন কী বলে তা পরীক্ষা করুন:

unicodedata.normalize (form, unistr) ইউনিকোড স্ট্রিং ইউনিস্টারের জন্য সাধারণ ফর্ম ফর্মটি ফিরিয়ে দিন। ফর্মের জন্য বৈধ মানগুলি হ'ল 'এনএফসি', 'এনএফকেসি', 'এনএফডি', এবং 'এনএফকেডি'।

ইউনিকোড স্ট্যান্ডার্ডটি ইউনিকোড স্ট্রিংয়ের বিভিন্ন সাধারণকরণের ফর্মগুলি সংজ্ঞায়িত করে, যা ক্যানোনিকাল সমতুল্যতা এবং সামঞ্জস্যের সমতুল্যতার সংজ্ঞার ভিত্তিতে তৈরি হয়। ইউনিকোডে, বেশ কয়েকটি চরিত্র বিভিন্নভাবে প্রকাশ করা যেতে পারে। উদাহরণস্বরূপ, ইউ +00 সি 7 (সিডিল্লার সাথে ল্যাটিন ক্যাপিটাল লেটার সি) অক্ষরটি ইউ + 0043 (ল্যাটিন ক্যাপিটাল লেটার সি) ইউ + 0327 (সংযুক্তি সিডিল্লা) হিসাবেও প্রকাশ করা যেতে পারে।

প্রতিটি চরিত্রের জন্য দুটি স্বাভাবিক ফর্ম রয়েছে: সাধারণ ফর্ম সি এবং নরমাল ফর্ম D. সাধারণ ফর্ম ডি (এনএফডি) কে ক্যানোনিকাল পচন হিসাবেও পরিচিত এবং প্রতিটি চরিত্রকে তার পচনশীল আকারে অনুবাদ করে। সাধারণ ফর্ম সি (এনএফসি) প্রথমে একটি ক্যানোনিকাল পচন প্রয়োগ করে, তারপরে আবার প্রাক-সম্মিলিত অক্ষরগুলি রচনা করে।

এই দুটি ফর্ম ছাড়াও, সামঞ্জস্যের সমতুল্যের ভিত্তিতে দুটি অতিরিক্ত সাধারণ ফর্ম রয়েছে। ইউনিকোডে, নির্দিষ্ট অক্ষরগুলি সমর্থিত হয় যা সাধারণত অন্যান্য অক্ষরের সাথে একত্রিত হয়। উদাহরণস্বরূপ, ইউ + 2160 (রোমান ম্যাসেরাল ওয়ান) হ'ল ইউ + 0049 (ল্যাটিন ক্যাপিটাল লেটার I) এর মতোই জিনিস। তবে বিদ্যমান অক্ষর সেটগুলির সাথে সামঞ্জস্য করার জন্য এটি ইউনিকোডে সমর্থিত (যেমন gb2312)।

সাধারণ ফর্ম কেডি (এনএফকেডি) সামঞ্জস্যতা পচনকে প্রয়োগ করবে, অর্থাত্ সমস্ত সামঞ্জস্য অক্ষরকে তাদের সমতুল্যর সাথে প্রতিস্থাপন করবে। সাধারণ ফর্ম কেসি (এনএফকেসি) প্রথমে উপযুক্ততা পচন প্রয়োগ করে, তারপরে ক্যানোনিকাল রচনাটি অনুসরণ করে।

এমনকি দুটি ইউনিকোড স্ট্রিং যদি স্বাভাবিক করা হয় এবং মানব পাঠকের সাথে একই রকম দেখা যায় তবে যদি একটিতে বর্ণের সংমিশ্রণ থাকে এবং অন্যটি না থাকে তবে তারা সমান তুলনা করতে পারে না।

এটা আমার জন্য সমাধান। সহজ এবং সহজ।


3

নীচের সমাধানটি আমার জন্য কাজ করেছে, সবে যুক্ত হয়েছে

তুমি "স্ট্রিং"

আমার স্ট্রিংয়ের আগে স্ট্রিংটিকে ইউনিকোড হিসাবে উপস্থাপন করুন।

result_html = result.to_html(col_space=1, index=False, justify={'right'})

text = u"""
<html>
<body>
<p>
Hello all, <br>
<br>
Here's weekly summary report.  Let me know if you have any questions. <br>
<br>
Data Summary <br>
<br>
<br>
{0}
</p>
<p>Thanks,</p>
<p>Data Team</p>
</body></html>
""".format(result_html)

3

হায়রে এটি পাইথন 3 এ কমপক্ষে ...

পাইথন ঘ

কখনও কখনও ত্রুটিটি পরিবেশের ভেরিয়েবলগুলিতে থাকে এবং এনকন্ডিং হয়

import os
import locale
os.environ["PYTHONIOENCODING"] = "utf-8"
myLocale=locale.setlocale(category=locale.LC_ALL, locale="en_GB.UTF-8")
... 
print(myText.encode('utf-8', errors='ignore'))

যেখানে এনকোডিংয়ে ত্রুটিগুলি উপেক্ষা করা হয়।


2

আমার কেবল এই সমস্যাটি ছিল, এবং গুগল আমাকে এখানে নিয়ে এসেছিল, তাই কেবলমাত্র এখানে সাধারণ সমাধানগুলিতে যুক্ত করার জন্য, এটি আমার পক্ষে কাজ করেছে:

# 'value' contains the problematic data
unic = u''
unic += value
value = unic

নেডের উপস্থাপনা পড়ে আমার এই ধারণা ছিল ।

যদিও এটি কেন কাজ করে তা পুরোপুরি বোঝার দাবি করি না। সুতরাং কেউ যদি এই উত্তরটি সম্পাদনা করতে পারে বা ব্যাখ্যা করতে একটি মন্তব্য করতে পারে, আমি এটির প্রশংসা করব।


3
কি typeমূল্য? এর আগে এবং পরে? আমি মনে করি কেন যে কাজ করে একটি করে হয় unic += valueযা একই হিসাবে unic = unic + valueআপনি একটি স্ট্রিং এবং একটি ইউনিকোড, যেখানে পাইথন তারপর পরিসমাপ্তি জন্য ইউনিকোড অনুমান যোগ করা হয় unicঅর্থাত আরো সুনির্দিষ্ট প্রকার (যখন আপনি এই কাজ করতে মনে a = float(1) + int(1), aএকটি float হয়ে) এবং তারপরে নতুন বস্তুর দিকে value = unicইঙ্গিত valueকরে unicযা ইউনিকোড হতে পারে।
টম ম্যাদডেল্টেন

2

manage.py migrateস্থানীয়ীকৃত ফিক্সচার সহ জ্যাঙ্গোতে চলাকালীন আমরা এই ত্রুটিটি আঘাত করেছি ।

আমাদের উত্সটিতে এই # -*- coding: utf-8 -*-ঘোষণাটি অন্তর্ভুক্ত ছিল, মাইএসকিউএল সঠিকভাবে utf8 এর জন্য কনফিগার করা হয়েছিল এবং উবুন্টুতে উপযুক্ত ভাষা প্যাক এবং মানগুলি ছিল /etc/default/locale

সমস্যাটি সহজভাবে ছিল যে জ্যাঙ্গো ধারক (আমরা ডকার ব্যবহার করি) এর অনুপস্থিত ছিল LANG

পুনরায় চলমান মাইগ্রেশনগুলির আগে কনটেইনার সেট LANGকরা en_US.UTF-8এবং পুনরায় চালু করা সমস্যার সমাধান করে।


1

এখানে অনেক উত্তর (উদাহরণস্বরূপ @agf এবং @Andbdru) ইতিমধ্যে ওপি প্রশ্নের সর্বাপেক্ষা তাত্ক্ষণিক দিকগুলিকে সম্বোধন করেছে।

যাইহোক, আমি মনে করি একটি সূক্ষ্ম তবে গুরুত্বপূর্ণ দিক রয়েছে যা বেশিরভাগ ক্ষেত্রে উপেক্ষা করা হয়েছে এবং এটি পাইথনের এনকোডিংগুলি বোঝার চেষ্টা করার সময় আমার মতো যারা এখানে এসেছিলেন তাদের জন্য অত্যন্ত গুরুত্বপূর্ণ: পাইথন 2 বনাম পাইথন 3 চরিত্র উপস্থাপনার ব্যবস্থাপনার বুনিয়াদ আলাদা different । আমি মনে করি যে বিভ্রান্তির এক বিরাট অংশ হ'ল সংস্করণ সম্পর্কে অবগত না হয়ে পাইথনে এনকোডিংগুলি পড়ার সাথে মানুষের সম্পর্ক আছে।

স্পোলস্কির চরিত্র উপস্থাপনা এবং ইউনিকোডের পরিচয় পড়ে এবং তারপরে পাইথন 2 এবং পাইথন 3-তে ইউনিকোডের ব্যাচেল্ডারে চলে যাওয়ার মাধ্যমে ওপি সমস্যার মূল কারণটি বুঝতে আগ্রহী আমি কাউকে পরামর্শ দিই ।


হ্যাঁ, আমার ত্রুটিটি পাইথন ২.7, 'a'.format (u'ñ') এ ছিল এবং সঠিক সমাধানটি .encode ('utf-8') ব্যবহার না করে সর্বদা ইউনিকোড স্ট্রিং ব্যবহার করা হয় (পাইথন 3 এ ডিফল্ট) ): u'a'.format (u'ñ '),
রোজেলিও

1

ভেরিয়েবলকে str (ভেরিয়েবল) এ রূপান্তর এড়াতে চেষ্টা করুন। কখনও কখনও, এটি সমস্যার কারণ হতে পারে।

এড়াতে সহজ পরামর্শ:

try: 
    data=str(data)
except:
    data = data #Don't convert to String

উপরের উদাহরণটি এনকোড ত্রুটিটিও সমাধান করবে।


আপনি কেবলমাত্র বাদ দিয়ে ত্রুটিতে চলে যাবেন তাই এটি কাজ করে না
অরেলে কলিনেট

0

যদি আপনার মতো কিছু packet_data = "This is data"থাকে তবে পরের লাইনে এটি করুন, শুরু করার ঠিক পরে packet_data:

unic = u''
packet_data = unic

0

অজগর 3.0 এবং তারপরে আপডেট করুন। পাইথন সম্পাদকটিতে নিম্নলিখিতটি ব্যবহার করে দেখুন:

locale-gen en_US.UTF-8
export LANG=en_US.UTF-8 LANGUAGE=en_US.en
LC_ALL=en_US.UTF-8

এটি ইউটিএফ -8 ফর্ম্যাটে সিস্টেমের ডিফল্ট লোকাল এনকোডিং সেট করে।

এখানে পিইপি 538 তে আরও পড়তে পারেন - উত্তরাধিকার সি লোকালটি কোনও ইউটিএফ -8 ভিত্তিক লোকালে জড়িত করে


0

আমি এই সমস্যাটি ইউনিকোড অক্ষরগুলিতে আউটপুট দেওয়ার চেষ্টা করছিলাম stdout, তবে সাথেsys.stdout.write মুদ্রণের পরিবর্তে (যাতে আমি আলাদা কোনও ফাইলে আউটপুট সমর্থন করতে পারি)।

বিউটিফুলসুপের নিজস্ব ডকুমেন্টেশন থেকে , আমি কোডেকস লাইব্রেরি সহ এটি সমাধান করেছি:

import sys
import codecs

def main(fIn, fOut):
    soup = BeautifulSoup(fIn)
    # Do processing, with data including non-ASCII characters
    fOut.write(unicode(soup))

if __name__ == '__main__':
    with (sys.stdin) as fIn: # Don't think we need codecs.getreader here
        with codecs.getwriter('utf-8')(sys.stdout) as fOut:
            main(fIn, fOut)

0

এই সমস্যাটি প্রায়শই ঘটে যখন একটি জ্যাঙ্গো প্রকল্প অ্যাপাচি ব্যবহার করে স্থাপন করে। কারণ অ্যাপাচি পরিবেশ পরিবর্তনশীল LANG = C সেট করে / etc / sysconfig / httpd। কেবল ফাইলটি খুলুন এবং এই সেটিংটিতে মন্তব্য করুন (বা আপনার স্বাদে পরিবর্তন করুন)। অথবা ডাব্লুএসজিআইডিএমমনপ্রসেস কমান্ডের ল্যাং বিকল্পটি ব্যবহার করুন, এক্ষেত্রে আপনি বিভিন্ন ভার্চুয়ালহোস্টে বিভিন্ন LANG পরিবেশের পরিবর্তনশীল সেট করতে সক্ষম হবেন।


0

প্রস্তাবিত সমাধানটি আমার পক্ষে কাজ করে না, এবং আমি সমস্ত অ্যাস্কিআই অক্ষর ফেলে রেখে বাঁচতে পারি

s = s.encode('ascii',errors='ignore')

যা আমাকে এমন কিছু ফেলেছিল যা ত্রুটি ছুঁড়ে না ফেলে।


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