কীভাবে ঠিক করবেন: "ইউনিকোড ডিকোড এরিয়ার: 'এসকিআই' কোডেক বাইট ডিকোড করতে পারে না"


459
as3:~/ngokevin-site# nano content/blog/20140114_test-chinese.mkd
as3:~/ngokevin-site# wok
Traceback (most recent call last):
File "/usr/local/bin/wok", line 4, in
Engine()
File "/usr/local/lib/python2.7/site-packages/wok/engine.py", line 104, in init
self.load_pages()
File "/usr/local/lib/python2.7/site-packages/wok/engine.py", line 238, in load_pages
p = Page.from_file(os.path.join(root, f), self.options, self, renderer)
File "/usr/local/lib/python2.7/site-packages/wok/page.py", line 111, in from_file
page.meta['content'] = page.renderer.render(page.original)
File "/usr/local/lib/python2.7/site-packages/wok/renderers.py", line 46, in render
return markdown(plain, Markdown.plugins)
File "/usr/local/lib/python2.7/site-packages/markdown/init.py", line 419, in markdown
return md.convert(text)
File "/usr/local/lib/python2.7/site-packages/markdown/init.py", line 281, in convert
source = unicode(source)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe8 in position 1: ordinal not in range(128). -- Note: Markdown only accepts unicode input!

কিভাবে এটা মেরামত করা যেতে পারে?

অন্য কয়েকটি পাইথন-ভিত্তিক স্ট্যাটিক ব্লগ অ্যাপ্লিকেশনগুলিতে, চীনা পোস্টটি সফলভাবে প্রকাশ করা যেতে পারে। যেমন এই অ্যাপ্লিকেশন: http://github.com/vrypan/bucket3 । আমার সাইটে http://bc3.brite.biz/ , চাইনিজ পোস্টটি সফলভাবে প্রকাশ করা যেতে পারে।


উত্তর:


569

tl; ডাঃ / দ্রুত সমাধান

  • উইলি নিলির ডিকোড / এনকোড করবেন না
  • আপনার স্ট্রিংগুলি ইউটিএফ -8 এনকোডযুক্ত বলে মনে করবেন না
  • আপনার কোডে যত তাড়াতাড়ি সম্ভব স্ট্রিংগুলি ইউনিকোড স্ট্রিংয়ে রূপান্তর করার চেষ্টা করুন
  • আপনার লোকেলটি ঠিক করুন: পাইথন ৩.6-এ ইউনিকোডডেকোডেরর কীভাবে সমাধান করবেন?
  • দ্রুত reloadহ্যাকগুলি ব্যবহার করতে প্রলোভিত হবেন না

পাইথন ২.x-এ ইউনিকোড জেন - দীর্ঘ সংস্করণ

উত্স না দেখে এর মূল কারণটি জানা মুশকিল, তাই আমাকে সাধারণত কথা বলতে হবে।

UnicodeDecodeError: 'ascii' codec can't decode byteসাধারণত যখন আপনি পাইথন ২.x রূপান্তর করার চেষ্টা করেন strতখন মূল স্ট্রিংয়ের এনকোডিং নির্দিষ্ট না করে অ-এএসসিআইআইকে একটি ইউনিকোড স্ট্রিংয়ে রূপান্তর করতে পারেন ।

সংক্ষেপে, ইউনিকোড স্ট্রিংগুলি সম্পূর্ণ পৃথক পাইথন স্ট্রিং যা কোনও এনকোডিং ধারণ করে না। তারা কেবল ইউনিকোড পয়েন্ট কোড ধারণ করে এবং তাই পুরো বর্ণালী থেকে যে কোনও ইউনিকোড পয়েন্ট ধরে রাখতে পারে। স্ট্রিংগুলিতে এনকোডযুক্ত পাঠ্য থাকে, ইউটিএফ -8, ইউটিএফ -16, আইএসও-8895-1, জিবিকে, বিগ 5 ইত্যাদি স্ট্রিংগুলি ইউনিকোডে ডিকোড হয় এবং ইউনিকোডগুলি স্ট্রিংগুলিতে এনকোড থাকে । ফাইল এবং পাঠ্য ডেটা সর্বদা এনকোড স্ট্রিংগুলিতে স্থানান্তরিত হয়।

মার্কডাউন মডিউল লেখক সম্ভবত unicode()বাকী কোডটির মান গেট হিসাবে ব্যবহার করবেন (যেখানে ব্যতিক্রম ছুঁড়েছে) - এটি ASCII রূপান্তর করবে বা বিদ্যমান ইউনিকোড স্ট্রিংগুলিকে নতুন ইউনিকোড স্ট্রিংয়ে পুনরায় মোড়ায়। মার্কডাউন লেখকগণ আগত স্ট্রিংটির এনকোডিংটি জানতে পারবেন না তাই মার্কডাউনে যাওয়ার আগে ইউনিকোড স্ট্রিংয়ের স্ট্রিংগুলি ডিকোড করার জন্য আপনার উপর নির্ভর করবে।

ইউনিকোড স্ট্রিংগুলি আপনার কোডে uস্ট্রিংয়ের উপসর্গ ব্যবহার করে ঘোষণা করা যেতে পারে । যেমন

>>> my_u = u'my ünicôdé strįng'
>>> type(my_u)
<type 'unicode'>

ইউনিকোড স্ট্রিং ফাইল, ডাটাবেস এবং নেটওয়ার্ক মডিউল থেকেও আসতে পারে। যখন এটি হয়, আপনার এনকোডিং সম্পর্কে চিন্তা করার দরকার নেই।

Gotchas

strআপনি স্পষ্টভাবে কল না করলেও ইউনিকোড থেকে রূপান্তর ঘটতে পারে unicode()

নিম্নলিখিত পরিস্থিতিতে UnicodeDecodeErrorব্যতিক্রম ঘটায় :

# Explicit conversion without encoding
unicode('€')

# New style format string into Unicode string
# Python will try to convert value string to Unicode first
u"The currency is: {}".format('€')

# Old style format string into Unicode string
# Python will try to convert value string to Unicode first
u'The currency is: %s' % '€'

# Append string to Unicode
# Python will try to convert string to Unicode first
u'The currency is: ' + '€'         

উদাহরণ

নিম্নলিখিত চিত্রটিতে, আপনি caféটার্মিনালের ধরণের উপর নির্ভর করে শব্দটি কীভাবে "ইউটিএফ -8" বা "সিপি 1252" এনকোডিংয়ে এনকোড করা হয়েছে তা দেখতে পাবেন । উভয় উদাহরণে, cafকেবল নিয়মিত আসকি। ইউটিএফ -8 এ éদুটি বাইট ব্যবহার করে এনকোড করা হয়েছে। "সিপি 1252" তে, 0 0xE9 (এটি ইউনিকোড পয়েন্ট মান হিসাবে ঘটে (এটি কোনও কাকতালীয় ঘটনা নয়))। সঠিকটি decode()আহ্বান করা হয়েছে এবং পাইথন ইউনিকোডে রূপান্তরটি সাফল্যজনক: একটি স্ট্রিংয়ের চিত্রটি পাইথন ইউনিকোড স্ট্রিংয়ে রূপান্তরিত হচ্ছে

এই চিত্রটিতে, decode()সাথে ডাকা হয় ascii(যা unicode()কোনও এনকোডিং না দিয়ে কল করার মতো )। যেহেতু এএসসিআইআই এর চেয়ে বেশি বাইট থাকতে পারে না 0x7F, এটি একটি UnicodeDecodeErrorব্যতিক্রম ছুঁড়ে ফেলবে :

একটি স্ট্রিংয়ের ডায়াগ্রামটি ভুল এনকোডিংয়ের সাথে পাইথন ইউনিকোড স্ট্রিংয়ে রূপান্তরিত হচ্ছে

ইউনিকোড স্যান্ডউইচ

আপনার কোডটিতে একটি ইউনিকোড স্যান্ডউইচ গঠন করা ভাল অনুশীলন, যেখানে আপনি সমস্ত ইনকামিং ডেটা ইউনিকোড স্ট্রিংয়ে ডিকোড করেন, ইউনিকোডের সাথে কাজ করেন, তারপরে বেরোনোর ​​পথে এনকোড strকরুন। এটি আপনাকে আপনার কোডের মাঝখানে স্ট্রিংগুলির এনকোডিং সম্পর্কে উদ্বেগ থেকে বাঁচায়।

ইনপুট / ডিকোড

সোর্স কোড

যদি আপনার সোর্স কোডে নন-এএসসিআইআই বেক করার প্রয়োজন হয় তবে কেবল একটি দিয়ে স্ট্রিংটির উপসর্গ রেখে ইউনিকোড স্ট্রিংগুলি তৈরি করুন u। যেমন

u'Zürich'

পাইথনকে আপনার উত্স কোডটি ডিকোড করার অনুমতি দেওয়ার জন্য আপনার ফাইলের প্রকৃত এনকোডিংয়ের সাথে মিল রাখতে আপনাকে একটি এনকোডিং শিরোনাম যুক্ত করতে হবে। উদাহরণস্বরূপ, আপনার ফাইলটিকে 'ইউটিএফ -8' হিসাবে এনকোড করা থাকলে আপনি ব্যবহার করতে পারেন:

# encoding: utf-8

এটি কেবল তখনই প্রয়োজনীয় যখন আপনার উত্স কোডটিতে অ-ASCII থাকে ।

নথি পত্র

সাধারণত একটি ফাইল থেকে নন-এএসসিআইআই ডেটা পাওয়া যায়। ioমডিউল একটি TextWrapper যে ফ্লাইটে আপনার ফাইল decodes, একজন প্রদত্ত ব্যবহার উপলব্ধ encoding। আপনাকে অবশ্যই ফাইলের জন্য সঠিক এনকোডিংটি ব্যবহার করতে হবে - এটি সহজেই অনুমান করা যায় না। উদাহরণস্বরূপ, একটি ইউটিএফ -8 ফাইলের জন্য:

import io
with io.open("my_utf8_file.txt", "r", encoding="utf-8") as my_file:
     my_unicode_string = my_file.read() 

my_unicode_stringতাহলে মার্কডাউনে যাওয়ার জন্য উপযুক্ত হবে be যদি লাইনটি UnicodeDecodeErrorথেকে একটি হয় read(), তবে আপনি সম্ভবত ভুল এনকোডিং মানটি ব্যবহার করেছেন।

সিএসভি ফাইল

পাইথন ২.7 সিএসভি মডিউলটি অ-এসসিআইআই অক্ষরগুলিকে সমর্থন করে না 😩 Https://pypi.python.org/pypi/backports.csv- র সাহায্যে সহায়তার হাত রয়েছে ।

এটি উপরের মতো ব্যবহার করুন তবে এতে খোলা ফাইলটি পাস করুন:

from backports import csv
import io
with io.open("my_utf8_file.txt", "r", encoding="utf-8") as my_file:
    for row in csv.reader(my_file):
        yield row

ডেটাবেস

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

মাইএসকিউএল

সংযোগ স্ট্রিং এ যোগ করুন:

charset='utf8',
use_unicode=True

যেমন

>>> db = MySQLdb.connect(host="localhost", user='root', passwd='passwd', db='sandbox', use_unicode=True, charset="utf8")
পোস্টগ্রি

যোগ করুন

psycopg2.extensions.register_type(psycopg2.extensions.UNICODE)
psycopg2.extensions.register_type(psycopg2.extensions.UNICODEARRAY)

HTTP- র

ওয়েব পৃষ্ঠাগুলি প্রায় কোনও এনকোডিংয়ে এনকোড করা যায়। Content-typeহেডার একটি থাকা উচিত charsetএনকোডিং এ প্রজ্ঞান ক্ষেত্র। সামগ্রীটি তখন এই মানটির বিপরীতে ম্যানুয়ালি ডিকোড করা যায়। বিকল্পভাবে পাইথন-অনুরোধগুলি ইউনিকোডগুলিতে ফিরে আসে response.text

ম্যানুয়ালি

আপনার যদি স্ট্রিংগুলি ম্যানুয়ালিভাবে ডিকোড করতে হয় তবে আপনি সহজভাবে করতে পারেন my_string.decode(encoding)যেখানে encodingউপযুক্ত এনকোডিং। পাইথন ২.x সমর্থিত কোডেকগুলি এখানে দেওয়া হয়েছে: স্ট্যান্ডার্ড এনকোডিংস । আবার আপনি যদি তা পান UnicodeDecodeErrorতবে সম্ভবত ভুল এনকোডিং পেয়েছেন।

স্যান্ডউইচের মাংস

ইউনিকোডের সাথে কাজ করুন যেমন আপনি সাধারণ স্টার্স করেন।

আউটপুট

stdout / মুদ্রণ

printstdout প্রবাহের মাধ্যমে লেখেন। পাইথন stdout এ একটি এনকোডার কনফিগার করার চেষ্টা করে যাতে ইউনিকোডগুলি কনসোলের এনকোডিংয়ে এনকোড থাকে। উদাহরণস্বরূপ, একটি লিনাক্স শেল যদি localeহয় en_GB.UTF-8, আউটপুট এনকোড করা হবে না UTF-8। উইন্ডোজে আপনি একটি 8 বিট কোড পৃষ্ঠাতে সীমাবদ্ধ থাকবেন।

দূষিত লোকেলের মতো একটি ভুলভাবে কনফিগার করা কনসোল অপ্রত্যাশিত মুদ্রণের ত্রুটির দিকে পরিচালিত করতে পারে। PYTHONIOENCODINGএনভায়রনমেন্ট ভেরিয়েবল stdout জন্য এনকোডিং জোর করতে পারে।

নথি পত্র

ইনপুটের মতোই io.openইউনিকোডগুলি স্বচ্ছভাবে এনকোডড বাইট স্ট্রিংগুলিতে রূপান্তর করতে ব্যবহার করা যেতে পারে।

তথ্যশালা

পড়ার জন্য একই কনফিগারেশনটি ইউনিকোডগুলি সরাসরি লেখার অনুমতি দেয়।

পাইথন ঘ

পাইথন 3 পাইথন ২.x এর চেয়ে বেশি ইউনিকোড সক্ষম নয়, তবে এটি বিষয়টিতে কিছুটা কম বিভ্রান্ত। যেমন নিয়মিত strএখন একটি ইউনিকোড স্ট্রিং এবং strএখন পুরানো bytes

ডিফল্ট এনকোডিংটি ইউটিএফ -8, সুতরাং যদি আপনি .decode()কোনও এনকোডিং না দিয়ে বাইট স্ট্রিং করেন, পাইথন 3 ইউটিএফ -8 এনকোডিং ব্যবহার করে। এটি সম্ভবত 50% লোকের ইউনিকোড সমস্যা সমাধান করে।

তদ্ব্যতীত, open()ডিফল্টরূপে পাঠ্য মোডে পরিচালনা করে, তাই ডিকোড করা str(ইউনিকোডগুলি) প্রদান করে। এনকোডিংটি আপনার লোকেল থেকে উদ্ভূত, যা ইউএনএফ x সিস্টেমে ইউটিএফ -8 বা উইন্ডোজ বাক্সে একটি 8-বিট কোড পৃষ্ঠা, যেমন উইন্ডোজ -1211 এর মতো হয়।

কেন আপনার ব্যবহার করা উচিত নয় sys.setdefaultencoding('utf8')

এটি একটি বাজে হ্যাক (আপনার ব্যবহারের একটি কারণ রয়েছে reload) যা কেবলমাত্র সমস্যার মুখোশ পাবে এবং পাইথন 3.x এ আপনার স্থানান্তরকে বাধাগ্রস্থ করবে। সমস্যাটি বুঝুন, মূল কারণটি ঠিক করুন এবং ইউনিকোড জেনটি উপভোগ করুন। দেখুন কেন আমরা পাই স্ক্রিপ্টে sys.setdeafultencoding ("utf-8") ব্যবহার করব না? বিস্তারি তথ্যের জন্য


2
পাইথন 2 উত্তর খুঁজছেন এমন কারও জন্য, আরও দরকারী টিএলডিআর: ইউনিকোড ব্যবহারের io.openজন্য ফাইল পড়ার / লেখার জন্য from __future__ import unicode_literalsঅন্যান্য ডেটা ইনপুট / আউটপুট (যেমন, ডাটাবেসগুলি) কনফিগার করুন।
ইডব্রি

আমরা কিভাবে এটি ঠিক করব? লোল এটি কোনও স্ক্রিপ্ট লেখার বিষয় নয়
ম্যাথু

@ ম্যাথেজ চেষ্টা করুন PYTHONIOENCODING=utf-8। যদি এটি ঠিক না করে তবে আপনার কোডটি ঠিক করার জন্য আপনাকে স্ক্রিপ্টের লেখকের সাথে যোগাযোগ করতে হবে।
অ্যালিস্টার ম্যাককর্ম্যাক

498

অবশেষে আমি এটি পেয়েছি:

as3:/usr/local/lib/python2.7/site-packages# cat sitecustomize.py
# encoding=utf8  
import sys  

reload(sys)  
sys.setdefaultencoding('utf8')

যাচাই করতে দাও:

as3:~/ngokevin-site# python
Python 2.7.6 (default, Dec  6 2013, 14:49:02)
[GCC 4.4.5] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> reload(sys)
<module 'sys' (built-in)>
>>> sys.getdefaultencoding()
'utf8'
>>>

উপরেরটি পাইথনের ডিফল্ট এনকোডিংটি দেখায় utf8। তাহলে ত্রুটি আর নেই।


7
আমি এটি চেষ্টা করে দেখি তবে এটি স্থায়ীভাবে এনকোডিংটি পরিবর্তন করতে পারে নি। একবার পাইথন কনসোলটি ছেড়ে দিয়ে আবার শুরু করুন, এনকোডিংটি এখনও একইরকম
macemers

37
ধন্যবাদ! তবে কেন এটি আমদানি করার পরে আমাদের পুনরায় লোড করা দরকার?
ডিমিটার্স

6
দিমিত্রিনার্কেভিচ, ইলিউসিভ সেটডেফাল্টেনকোডিং কার্যের কারণে। এটি পাইথন স্টার্টআপে মুছে ফেলা হয়েছে কারণ এটি সম্ভবত প্রথমে যথাযথ মুক্তির অংশ হওয়া উচিত ছিল না।
প্রিডি

3
এর অর্থ আপনি মূল কারণটি স্থির করেন নি। আপনি সবেমাত্র কোনও ইমপ্লাইড রূপান্তরকে
অ্যালাস্টার ম্যাককর্ম্যাক

5
@ এমিরাকুলিক্সেক্স পাইথন 3-এর ডিফল্ট এনকোডিংটি ইউটিএফ -8 হ'ল ইউনিকোড স্ট্রিংগুলি ডিফল্ট হিসাবে রয়েছে str, সুতরাং এটি অতিরঞ্জিত নয়। পাইথন ২.x-এ, ইউনিকোডটি একটি রূপান্তর অবস্থায় ছিল, তাই ইউনিকোডে বাইটগুলি রূপান্তর করার সময় কোনও এনকোডিং গ্রহণ করা বিপজ্জনক হত। অতএব, Py2 ডিফল্ট হওয়া ASCII এর এনকোডিং ইচ্ছাকৃত পছন্দ ছিল এবং কেন ডিফল্ট এনকোডিং পরিবর্তন পুনরায় লোড এর ইচ্ছাকৃত হ্যাক প্রয়োজন sys। পি 2 তে এনকোডিংয়ের ত্রুটিগুলি নিষিদ্ধ করার সঠিক উপায়টি ইউনিকোডে স্পষ্টভাবে ডিকোড এবং এনকোড (বাইট) স্ট্রিংগুলি করা হয়, যখন রূপান্তরগুলি প্রয়োজনীয় হয় - কেবল স্ট্রিংগুলি ইউটিএফ -8 এনকোডড নয় বলে ধরে নেওয়া উচিত।
অ্যালাস্টার ম্যাককর্ম্যাক

130

এটি ক্লাসিক "ইউনিকোড ইস্যু"। আমি বিশ্বাস করি যে এটি কী ঘটছে তা সম্পূর্ণরূপে ব্যাখ্যা করার জন্য এটি ব্যাখ্যা করা স্ট্যাকওভারফ্লো উত্তরের সুযোগের বাইরে।

এটি এখানে ভাল ব্যাখ্যা করা হয়েছে

খুব সংক্ষিপ্ত সংক্ষেপে, আপনি এমন কিছু পাস করেছেন যা ইউনিকোড অক্ষরগুলিতে ডিকোড করা দরকার এমন কিছুকে বাইটের একটি স্ট্রিং হিসাবে ব্যাখ্যা করা হচ্ছে, তবে ডিফল্ট কোডেক (এসসিআই) ব্যর্থ হচ্ছে।

উপস্থাপনাটি আমি আপনাকে এড়াতে পরামর্শ প্রদানের দিকে নির্দেশ করেছি। আপনার কোডটিকে একটি "ইউনিকোড স্যান্ডউইচ" করুন। পাইথন 2 এ, এর ব্যবহারfrom __future__ import unicode_literals

আপডেট: কোডটি কীভাবে স্থির করা যায়:

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

source = unicode(source, 'utf-8')

1
এটি এখনও মাথাব্যথা। গ্রিনআসজেড, আপনি কি আমাকে একটি কঠিন সমাধান দিতে পারেন?
জেলে

1
আপনি কি জিজ্ঞাসা করছেন "এই ব্লগের ব্যবহারকারী হিসাবে আমি কীভাবে এই সমস্যাটি এড়াতে পারি?" অথবা আপনার প্রশ্ন "কীভাবে কোডটি ঠিক করতে পারব যাতে এই সমস্যাটি না ঘটে"?
গ্রিনএজেজেড

2
মিঃ গ্রীনসজেড: আমি কোথায় "উত্স = ইউনিকোড (উত্স, 'ইউটিএফ -8') রাখতে হবে?
জেলে

7
অদ্ভুত ... এক বছর ধরে ইতিবাচক প্রতিক্রিয়া পরে, হঠাৎ দুটি নেতিবাচক ভোট ... হু?
গ্রিনআসজেড 15'15

11
ব্যবহার currentFile = open(filename, 'rt', encoding='latin1')বা currentFile = open(filename, 'rt', encoding='utf-8')- এখানে দেখুন: stackoverflow.com/a/23917799/2047442
irudyak

42

কিছু ক্ষেত্রে, আপনি যখন আপনার ডিফল্ট এনকোডিং ( print sys.getdefaultencoding()) পরীক্ষা করেন , এটি ফিরে আসে যে আপনি ASCII ব্যবহার করছেন। আপনি যদি ইউটিএফ -8 এ পরিবর্তন করেন তবে আপনার ভেরিয়েবলের সামগ্রীর উপর নির্ভর করে এটি কাজ করে না। আমি অন্য উপায় খুঁজে পেয়েছি:

import sys
reload(sys)  
sys.setdefaultencoding('Cp1252')

ty, এটি আমার সমস্যার জন্য কাজ করেছিল var = u "" "" তে ইউনিকোডডাইকোড এরির ফেলে দিয়ে ""
ব্যবহারকারী 2426679

অ্যাট্রিবিউটআরার: মডিউল 'সিস'-এর কোনও' সেটেডফল্টেনকোডিং 'নেই
চেইন

এবং reload(sys)এটি নির্দিষ্ট কারণে ব্যবহৃত হয়।
মার্সিন ওরোলোস্কি

1
আমার জন্য কাজ! ধন্যবাদ!
ম্যাকিয়েজ

22

আমি নিম্নলিখিত ত্রুটি বার্তাটি সমাধান করতে অনুসন্ধান করছিলাম:

ইউনিকোডিকোডেরিয়র: 'এসকিআই' কোডেক বাইট 0xe2 পজিশনটি 5454 এ ডিকোড করতে পারে না: সীমাবদ্ধ নয় (128)

অবশেষে আমি 'এনকোডিং' নির্দিষ্ট করে এটি ঠিক করেছি:

f = open('../glove/glove.6B.100d.txt', encoding="utf-8")

আশা করি এটি আপনাকেও সহায়তা করতে পারে।


.csv ফাইলগুলি পড়ার / লেখার সময় এটি আমার জন্য ত্রুটিটি সমাধান করেছে, অন্যান্য উত্তরের তালিকাভুক্ত অন্য কোনও
জিনিসটির প্রয়োজন নেই

অন্যান্য উত্তরগুলি কেন এত বিশদ সরবরাহ করে তা আমি বুঝতে পারি না ... তবে এই সাধারণ সমাধানটি ভুলে যান। +10!
stan0

18
"UnicodeDecodeError: 'ascii' codec can't decode byte"

এই ত্রুটির কারণ: ইনপুট_স্ট্রিং অবশ্যই ইউনিকোড হতে হবে তবে স্ট্রাইক দেওয়া হয়েছিল

"TypeError: Decoding Unicode is not supported"

এই ত্রুটির কারণ: ইউনিকোড ইনপুট_স্ট্রিংকে ইউনিকোডে রূপান্তর করার চেষ্টা করা হচ্ছে


সুতরাং প্রথমে আপনার ইনপুট_স্ট্রিংটি পরীক্ষা করে দেখুন strএবং প্রয়োজনে ইউনিকোডে রূপান্তর করুন:

if isinstance(input_string, str):
   input_string = unicode(input_string, 'utf-8')

দ্বিতীয়ত, উপরেরটি কেবল প্রকারটি পরিবর্তন করে তবে অ্যাস্কিআই অক্ষরগুলি সরিয়ে দেয় না। আপনি যদি অ-অসি অক্ষরগুলি মুছতে চান:

if isinstance(input_string, str):
   input_string = input_string.decode('ascii', 'ignore').encode('ascii') #note: this removes the character and encodes back to string.

elif isinstance(input_string, unicode):
   input_string = input_string.encode('ascii', 'ignore')

9

আমি সর্বদা ইউনিকোডে রূপান্তরিত করাকে সেরা বলে মনে করি - তবে এটি অর্জন করা কঠিন কারণ বাস্তবে আপনাকে প্রতিটি যুক্তি প্রতিটি ফাংশন এবং পদ্ধতিতে যাচাই করতে হবে এবং স্ট্রিং প্রক্রিয়াজাতকরণের কিছু ফর্ম অন্তর্ভুক্ত করে তা রূপান্তর করতে হবে।

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

# guarantee unicode string
_u = lambda t: t.decode('UTF-8', 'replace') if isinstance(t, str) else t
_uu = lambda *tt: tuple(_u(t) for t in tt) 
# guarantee byte string in UTF8 encoding
_u8 = lambda t: t.encode('UTF-8', 'replace') if isinstance(t, unicode) else t
_uu8 = lambda *tt: tuple(_u8(t) for t in tt)

উদাহরণ:

text='Some string with codes > 127, like Zürich'
utext=u'Some string with codes > 127, like Zürich'
print "==> with _u, _uu"
print _u(text), type(_u(text))
print _u(utext), type(_u(utext))
print _uu(text, utext), type(_uu(text, utext))
print "==> with u8, uu8"
print _u8(text), type(_u8(text))
print _u8(utext), type(_u8(utext))
print _uu8(text, utext), type(_uu8(text, utext))
# with % formatting, always use _u() and _uu()
print "Some unknown input %s" % _u(text)
print "Multiple inputs %s, %s" % _uu(text, text)
# but with string.format be sure to always work with unicode strings
print u"Also works with formats: {}".format(_u(text))
print u"Also works with formats: {},{}".format(*_uu(text, text))
# ... or use _u8 and _uu8, because string.format expects byte strings
print "Also works with formats: {}".format(_u8(text))
print "Also works with formats: {},{}".format(*_uu8(text, text))

এই সম্পর্কে আরও কিছু যুক্তি এখানে ।


হাই, পাইথন 3-তে ফাংশন _ এটি এই মান 'ইটা £' দিয়ে কাজ করছে না।
মার্টিন

1
ঠিক আছে, আপনার "যুক্তি" কোথায় শুরু করবেন? print unicode(u'Zürich', encoding="UTF-8")এবং তারপরে অভিযোগ করুন "তবে আশ্চর্যরূপে আপনি ইউটিএফ 8-তে ইউনিকোড এক্সটাকে এনকোড করতে পারবেন না"। unicode()এনকোড হয় না; এটি ডিকোড হয় এবং আপনি কোনও ইউনিকোড ডিকোড করতে পারবেন না - এটি ইতিমধ্যে ডিকোড হয়েছে!
অ্যালাস্টার ম্যাককর্ম্যাক

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

3
@ মিয়ারাকুলিক্সস আমি দুঃখিত, আমার মানে এই নয় যে আমি কোনও জটকের মতো এসে পৌঁছেছি। আপনি যখনই আপনার কোডটিতে স্ট্রিংটি ব্যবহার করেন তখন ডিকোডিং এবং এনকোডিংয়ের বিষয়ে চিন্তা করা কেবল অপ্রয়োজনীয়।
অ্যালাস্টার ম্যাককর্ম্যাক

7

একটি উবুন্টু ইনস্টলেশন অপারেটিং সিস্টেমের স্তরে এটি সমাধানের জন্য নিম্নলিখিত পরীক্ষা করে দেখুন:

$ locale charmap

যদি তুমি পাও

locale: Cannot set LC_CTYPE to default locale: No such file or directory

পরিবর্তে

UTF-8

তারপরে সেট করুন LC_CTYPEএবং এটি LC_ALLপছন্দ করুন:

$ export LC_ALL="en_US.UTF-8"
$ export LC_CTYPE="en_US.UTF-8"

6

এনকোড একটি ইউনিকোড অবজেক্টকে স্ট্রিং অবজেক্টে রূপান্তর করে। আমি মনে করি আপনি একটি স্ট্রিং অবজেক্ট এনকোড করার চেষ্টা করছেন। প্রথমে আপনার ফলাফলটিকে ইউনিকোড অবজেক্টে রূপান্তর করুন এবং তারপরে সেই ইউনিকোড অবজেক্টটিকে 'utf-8' এ এনকোড করুন। উদাহরণ স্বরূপ

    result = yourFunction()
    result.decode().encode('utf-8')

4

আমারও একই সমস্যা ছিল তবে এটি পাইথন ৩ এর জন্য কাজ করেনি I আমি এটি অনুসরণ করেছি এবং এটি আমার সমস্যার সমাধান করেছে:

enc = sys.getdefaultencoding()
file = open(menu, "r", encoding = enc)

আপনি যখন ফাইলটি পড়ছেন / লিখছেন তখন আপনাকে এনকোডিং সেট করতে হবে।


4

একই ত্রুটি পেয়েছি এবং এটি আমার ত্রুটি সমাধান করেছে। ধন্যবাদ! অজগর 2 এবং পাইথন 3 ইউনিকোড হ্যান্ডলিংয়ের মধ্যে পৃথক পৃথকভাবে পিকযুক্ত ফাইলগুলি লোডের পক্ষে বেশ বেমানান। সুতরাং পাইথন আচারের এনকোডিং যুক্তি ব্যবহার করুন। আমার পাইথন ৩.7 থেকে অদ্ভুত ডেটা খোলার চেষ্টা করার সময় নীচের লিঙ্কটি আমাকে অনুরূপ সমস্যার সমাধান করতে সহায়তা করেছিল, যখন আমার ফাইলটি পাইথন ২.x সংস্করণে মূলত সংরক্ষণ করা হয়েছিল। https://blog.modest-destiny.com/posts/python-2-and-3-comp موافق-pickle-save-and-load/ আমি আমার স্ক্রিপ্টে লোড_পিক্লে ফাংশনটি অনুলিপি করেছি এবং আমার লোড করার সময় লোড_পিক্লে (পিকেল_ফায়াল) ডেকে আনি ইনপুট_ডাটা এর মতো:

input_data = load_pickle("my_dataset.pkl")

এখানে লোডপিকল ফাংশনটি রয়েছে:

def load_pickle(pickle_file):
    try:
        with open(pickle_file, 'rb') as f:
            pickle_data = pickle.load(f)
    except UnicodeDecodeError as e:
        with open(pickle_file, 'rb') as f:
            pickle_data = pickle.load(f, encoding='latin1')
    except Exception as e:
        print('Unable to load data ', pickle_file, ':', e)
        raise
    return pickle_data

1
load_pickleআপনার উত্তরে ফাংশনের সংজ্ঞা অন্তর্ভুক্ত করা ভাল ।
সান্য্যাশ

4

এটি আমার পক্ষে কাজ করেছে:

    file = open('docs/my_messy_doc.pdf', 'rb')

3

সংক্ষেপে, পাইথন 2 এ যথাযথ ইউনিকোড পরিচালনা নিশ্চিত করতে:

  • io.openফাইল পড়ার / লেখার জন্য ব্যবহার করুন
  • ব্যবহার from __future__ import unicode_literals
  • ইউনিকোড ব্যবহার করতে অন্যান্য ডেটা ইনপুট / আউটপুটগুলি (যেমন, ডাটাবেসগুলি, নেটওয়ার্ক) কনফিগার করুন
  • আপনি যদি আউটপুটগুলি utf-8 এ কনফিগার করতে না পারেন তবে তাদের জন্য আপনার আউটপুট রূপান্তর করুন print(text.encode('ascii', 'replace').decode())

ব্যাখ্যার জন্য, @ অ্যালাস্টার ম্যাককর্মাকের বিশদ উত্তর দেখুন


io.open(path, 'r', encoding='utf-8')Ut utf-8-encoded ফাইলগুলি পড়তে ব্যবহার করুন ।
বব স্টেইন

3

আমার একই ত্রুটি ছিল, অ-এসকিআই অক্ষর (মান সহ বাইটস> 128) সহ ইউআরএল, আমার সমাধান:

url = url.decode('utf8').encode('utf-8')

দ্রষ্টব্য: utf-8, utf8 হ'ল সহজ উপাধি। কেবল 'utf8' বা 'utf-8' ব্যবহার করে একই পদ্ধতিতে কাজ করা উচিত

আমার ক্ষেত্রে, পাইথন 2.7 এ, আমার জন্য কাজ, আমি এই অ্যাসাইনমেন্টের এ 'কিছু' পরিবর্তিত অনুমান strঅভ্যন্তরীণ উপস্থাপনা - অর্থাৎ, এটা ব্যাক বাইট ক্রম ডান পাঠোদ্ধারতা বাধ্য করে urlএবং পরিশেষে একটি মধ্যে পংক্তি রাখে UTF-8 str সঙ্গে সঠিক জায়গায় সমস্ত যাদু। পাইথনের ইউনিকোড আমার কাছে কালো জাদু। আশা করি কাজে লাগবে


1
কেন একটির মধ্যে একটি ড্যাশ এবং
অন্যটিতে

1
পাইথন এনকোডিংয়ের জন্য উপকরণগুলি গ্রহণ করে, আমি এখন চেষ্টা করেছি এবং একই সম্পাদনা করেছি ... কেবল আমি লক্ষ্য করি না যে আমি সেগুলি আলাদাভাবে লিখেছি, যোগ করুন নোট
ফ্যাবিয়ানো তারলাও

2

"পাস্তেলারিয়া ম্যালোরকা" স্ট্রিংয়ের সাথে আমি একই সমস্যা পেয়েছি এবং এর সাথে সমাধান করেছি:

unicode("Pastelería Mallorca", 'latin-1')

1

একটি জ্যাঙ্গো (1.9.10) / পাইথন 2.7.5 প্রকল্পে আমার ঘন ঘন UnicodeDecodeErrorব্যতিক্রম হয়; মূলত যখন আমি লগিংয়ে ইউনিকোড স্ট্রিং খাওয়ানোর চেষ্টা করি। আমি নির্বিচারে অবজেক্টগুলিকে মূলত 8-বিট আসকি স্ট্রিংগুলিতে ফর্ম্যাট করতে এবং কোনও অক্ষরকে টেবিলের পরিবর্তে '?' এ প্রতিস্থাপনের জন্য একটি সহায়ক ফাংশন তৈরি করেছি। আমি মনে করি এটি সর্বোত্তম সমাধান নয় তবে যেহেতু ডিফল্ট এনকোডিংটি এসকি (এবং আমি এটি পরিবর্তন করতে চাই না) এটি করবে:

Def encode_for_logging (সি, এনকোডিং = 'এসকিআই'):
    যদি আইসনস্ট্যান্স (সি, বেসস্ট্রিং):
        সি এনকোড (এনকোডিং, 'প্রতিস্থাপন') রিটার্ন করুন
    এলিফ আইসনস্ট্যান্স (সি, অবর্ণনীয়):
        সি_ = []
        সি জন্য ভি জন্য:
            c_.append (এনকোড_ফর্ম_লগিং (v, এনকোডিং))
        ফিরতি সি_
    অন্য:
        এনকোড_ফর্ম_লগিং (ইউনিকোড (সি)) রিটার্ন করুন
`


1

এই স্ট্রিংটি তখন ঘটে যখন আমাদের স্ট্রিংয়ে কিছু অ ASCII অক্ষর রয়েছে এবং আমরা সঠিক ডিকোডিং ছাড়াই সেই স্ট্রিংয়ের কোনও ক্রিয়াকলাপ চালিয়ে যাচ্ছি। এটি আমার সমস্যা সমাধানে আমাকে সহায়তা করেছিল। আমি নীচে যেমন কলাম আইডি, পাঠ্য এবং ডিকোডিং অক্ষর সহ একটি সিএসভি ফাইল পড়ছি:

train_df = pd.read_csv("Example.csv")
train_data = train_df.values
for i in train_data:
    print("ID :" + i[0])
    text = i[1].decode("utf-8",errors="ignore").strip().lower()
    print("Text: " + text)

0

এখানে আমার সমাধান, কেবল এনকোডিং যুক্ত করুন add with open(file, encoding='utf8') as f

এবং যেহেতু গ্লোভ ফাইলটি পড়তে একটি দীর্ঘ সময় লাগবে, তাই আমি গ্লাভ ফাইলকে একটি ন্পু ফাইলটিতে প্রস্তাব দিই। যখন নেটেক্স সময় আপনি এম্বেডিং ওজনগুলি পড়বেন তখন এটি আপনার সময় সাশ্রয় করবে।

import numpy as np
from tqdm import tqdm


def load_glove(file):
    """Loads GloVe vectors in numpy array.
    Args:
        file (str): a path to a glove file.
    Return:
        dict: a dict of numpy arrays.
    """
    embeddings_index = {}
    with open(file, encoding='utf8') as f:
        for i, line in tqdm(enumerate(f)):
            values = line.split()
            word = ''.join(values[:-300])
            coefs = np.asarray(values[-300:], dtype='float32')
            embeddings_index[word] = coefs

    return embeddings_index

# EMBEDDING_PATH = '../embedding_weights/glove.840B.300d.txt'
EMBEDDING_PATH = 'glove.840B.300d.txt'
embeddings = load_glove(EMBEDDING_PATH)

np.save('glove_embeddings.npy', embeddings) 

সংক্ষিপ্ত লিঙ্ক: https://gist.github.com/BrambleXu/634a844cdd3cd04bb2e3ba3c83aef227


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