পাইথনে ইউনিকোড () এবং এনকোড () ফাংশনগুলির ব্যবহার


83

পাথ ভেরিয়েবলের এনকোডিং এবং এটি এসকিউএল ডাটাবেসে সন্নিবেশ করানোর ক্ষেত্রে আমার একটি সমস্যা আছে । আমি এটিকে এনকোড ("utf-8") ফাংশন দিয়ে সমাধান করার চেষ্টা করেছি যা সাহায্য করে না। তারপরে আমি ইউনিকোড () ফাংশন ব্যবহার করি যা আমাকে ইউনিকোড টাইপ করে ।

print type(path)                  # <type 'unicode'>
path = path.replace("one", "two") # <type 'str'>
path = path.encode("utf-8")       # <type 'str'> strange
path = unicode(path)              # <type 'unicode'>

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

sqlite3.ProgrammingError: আপনি 8-বিট বাইটস্ট্রিংগুলি ব্যবহার করা উচিত না আপনি যদি না এমন টেক্সট_ফ্যাক্টরি ব্যবহার করেন যা 8-বিট বাইটস্ট্রিংগুলি ব্যাখ্যা করতে পারে (যেমন টেক্সট_ফ্যাক্টরি = str)) এটির পরিবর্তে আপনার ইউনিকোড স্ট্রিংগুলিতে আপনার অ্যাপ্লিকেশনটি স্যুইচ করার পরামর্শ দেওয়া হচ্ছে।

আপনি কি আমাকে এই ত্রুটিটি সমাধান করতে এবং সঠিক ব্যবহার encode("utf-8")এবং unicode()কার্যকারিতা ব্যাখ্যা করতে সহায়তা করতে পারেন ? আমি প্রায়শই এর সাথে লড়াই করছি।

সম্পাদনা:

এই কার্যকর () বিবৃতি ত্রুটি উত্থাপিত:

cur.execute("update docs set path = :fullFilePath where path = :path", locals())

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

আমি ব্যবহার করতে পারি না

fullFilePath = unicode(fullFilePath.encode("utf-8"))

কারণ এটি এই ত্রুটি উত্থাপন করে:

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

পাইথন সংস্করণটি 2.7.2


ত্রুটি উত্থাপনকারী কোডটি কোথায়?
newtover

4
আপনার সঠিক প্রশ্ন থেকেই উত্তর দেওয়া হয়েছে: [ stackoverflow.com/questions/2392732/... [1]: stackoverflow.com/questions/2392732/...
garnertb

@ নতুন আমি প্রশ্নটি সম্পাদনা করেছি।
xralf

আপনি উভয় ব্যবহৃত ভেরিয়েবল রূপান্তর করেছেন unicode?
newtover

4
পাইথন 3 কীভাবে পাঠ্য এবং ডেটা পরিচালনা করে তা আমাকে সমস্ত কিছু বুঝতে সাহায্য করেছে।
অজগরটি

উত্তর:


88

আপনি encode("utf-8")ভুলভাবে ব্যবহার করছেন । পাইথন বাইট স্ট্রিং ( strপ্রকার) এর একটি এনকোডিং রয়েছে, ইউনিকোড নেই। আপনি একটি ইউনিকোড স্ট্রিংটি ব্যবহার করে পাইথন বাইট স্ট্রিংয়ে uni.encode(encoding)রূপান্তর করতে পারেন এবং আপনি বাইট স্ট্রিংকে ইউনিকোড স্ট্রিংয়ে s.decode(encoding)(বা সমতুল্য unicode(s, encoding)) ব্যবহার করে রূপান্তর করতে পারেন ।

যদি fullFilePathএবং pathবর্তমানে কোনও strধরণের হয় তবে সেগুলি কীভাবে এনকোড করা হয়েছে তা আপনার বের করা উচিত। উদাহরণস্বরূপ, যদি বর্তমান এনকোডিং utf-8 হয়, আপনি ব্যবহার করবেন:

path = path.decode('utf-8')
fullFilePath = fullFilePath.decode('utf-8')

যদি এটি এটি ঠিক না করে তবে আসল সমস্যাটি হ'ল আপনি নিজের execute()কলে একটি ইউনিকোড স্ট্রিং ব্যবহার করছেন না , এটি নিম্নলিখিতটিতে পরিবর্তন করে দেখুন:

cur.execute(u"update docs set path = :fullFilePath where path = :path", locals())

এই বিবৃতি fullFilePath = fullFilePath.decode("utf-8")এখনও ত্রুটি উত্থাপন UnicodeEncodeError: 'ascii' codec can't encode characters in position 32-34: ordinal not in range(128)। fullFilePath ধরনের সংমিশ্রণ Str ও সুতো থেকে নেওয়া টেক্সট ডিবি টেবিল যা UTF-8 এনকোডিং থাকা উচিত কলাম।
xralf

মতে এই কিন্তু UTF-8, হল UTF-16BE বা হল UTF-16LE হতে পারে। আমি কি এটি কোনওভাবে খুঁজে পেতে পারি?
xralf

@ এক্স্রাল্ফ, আপনি যদি বিভিন্ন strবস্তুর সংমিশ্রণ করছেন তবে আপনি এনকোডিংগুলি মিশ্রণ করতে পারেন। আপনি এর ফলাফল প্রদর্শন করতে পারেন print repr(fullFilePath)?
অ্যান্ড্রু ক্লার্ক

ডিকোড () এর কল করার আগেই আমি এটি প্রদর্শন করতে পারি । সমস্যাযুক্ত চরিত্রগুলি হ'ল। U0161 এবং \ u0165।
xralf

@ এক্স্রাল্ফ - তাহলে এটি ইতিমধ্যে ইউনিকোড? এক্সিকিউট কলটি ইউনিকোডে পরিবর্তন করার চেষ্টা করুন:cur.execute(u"update docs set path = :fullFilePath where path = :path", locals())
অ্যান্ড্রু ক্লার্ক

122

strবাইটগুলিতে unicodeপাঠ্য উপস্থাপনা হ'ল অক্ষরে পাঠ্য উপস্থাপনা।

আপনি পাঠ্যগুলি বাইট থেকে ইউনিকোডে ডিকোড করুন এবং কিছু ইউকেডিং সহ কোনও ইউনিকোড বাইটে এনকোড করুন।

এটাই:

>>> 'abc'.decode('utf-8')  # str to unicode
u'abc'
>>> u'abc'.encode('utf-8') # unicode to str
'abc'

ইউপিডি সেপ্টেম্বর 2020 : উত্তরটি পাইথন 2 বেশিরভাগ ব্যবহার করার সময় লেখা হয়েছিল। পাইথন 3-এ, strনামকরণ করা হয়েছিল bytes, এবং unicodeনামকরণ করা হয়েছিল str

>>> b'abc'.decode('utf-8') # bytes to str
'abc'
>>> 'abc'.encode('utf-8'). # str to bytes
b'abc'

4
খুব ভাল উত্তর, সরাসরি কথা। আমি যোগ করতে চাই যে unicodeঅক্ষর বা চিহ্ন, বা আরো জেনেরিক সম্পর্কে কথা বলে: runes যখন str, একটি নির্দিষ্ট এনকোডিং একটি বাইট স্ট্রিং উপস্থাপন করে এমন আপনাকে অবশ্যই decode(স্পষ্টত সঠিক এনকোডিং) নির্দিষ্ট runes পেতে
arainone

4
পাইথন 3.8 >>'str' object has no attribute 'decode'
যোহান ওবাদিয়া

আপনার কাছে ইউনিকোডকে স্ট্রমে পরিবর্তন করার জন্য ডকুমেন্টেশন আছে? আমি খুঁজে পাচ্ছি না
সিকাতোমো

4
@cikatomo এটি পাইথন 3-র অন্যতম মূল পরিবর্তন: ডকস.পিথন.অর্গ
৩.০

1

শেল থেকে স্ক্রিপ্ট চালানোর ঠিক আগে আপনি নিজের স্থানীয় সেটিংস সেট করেছেন তা নিশ্চিত করুন

$ locale -a | grep "^en_.\+UTF-8"
en_GB.UTF-8
en_US.UTF-8
$ export LC_ALL=en_GB.UTF-8
$ export LANG=en_GB.UTF-8

ডক্স: man locale, man setlocale

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