এনকোড / ডিকোডের মধ্যে পার্থক্য কী?


180

আমি কখনই নিশ্চিত হতে পারি নি যে আমি স্ট্র / ইউনিকোড ডিকোড এবং এনকোডের মধ্যে পার্থক্য বুঝি।

আমি জানি এটি str().decode()যখন আপনার কাছে একটি বাইটের স্ট্রিং থাকে যা আপনি জানেন যে একটি নির্দিষ্ট অক্ষর এনকোডিং রয়েছে, সেই এনকোডিংয়ের নাম দেওয়া হলে এটি একটি ইউনিকোড স্ট্রিং ফিরে আসবে।

আমি জানি যে unicode().encode()ইউনিকোড অক্ষরকে প্রদত্ত এনকোডিংয়ের নাম অনুসারে বাইটের স্ট্রিংয়ে রূপান্তর করে।

তবে আমি বুঝতে পারছি না কী str().encode()এবং unicode().decode()এর জন্য। কেউ কি ব্যাখ্যা করতে পারেন এবং সম্ভবত আমি উপরে অন্যায় করে থাকা অন্য যে কোনও কিছু সংশোধন করতে পারি?

সম্পাদনা করুন:

বেশ কয়েকটি উত্তর .encodeস্ট্রিংয়ে কী করে সে সম্পর্কে তথ্য দেয় তবে .decodeইউনিকোডের জন্য কেউ কী করে তা কেউ মনে করে না ।


আমি মনে করি এই পৃষ্ঠার দ্বিতীয় উত্তরটি যথেষ্ট পরিষ্কার এবং সংক্ষিপ্ত।
বেন

উত্তর:


106

decode(- নিচে দেখুন, যদি না আপনি কোনো কারণে একটি ইউনিকোড স্ট্রিং মধ্যে কিছু অ-পাঠ্য তথ্য আছে) ইউনিকোড স্ট্রিং পদ্ধতি সত্যিই সব যে কোনো অ্যাপ্লিকেশন নেই। এটি মূলত historicalতিহাসিক কারণে রয়েছে বলে আমি মনে করি। পাইথন 3 এ এটি সম্পূর্ণরূপে চলে গেছে।

unicode().decode()একটি অন্তর্নিহিত সঞ্চালন করা হবে এনকোডিং এর sডিফল্ট (ASCII) কোডেক ব্যবহার করে। এটি যাচাই করুন:

>>> s = u'ö'
>>> s.decode()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf6' in position 0:
ordinal not in range(128)

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

ত্রুটির বার্তাগুলি হুবহু একই।

জন্য str().encode()এটা অন্য উপায় কাছাকাছি - এটি একটি অন্তর্নিহিত প্রচেষ্টা পাঠোদ্ধারতা এর sডিফল্ট এনকোডিং সঙ্গে

>>> s = 'ö'
>>> s.decode('utf-8')
u'\xf6'
>>> s.encode()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0:
ordinal not in range(128)

এটির মতো ব্যবহৃত হয়, str().encode()অতিরিক্ত ব্যবহারের জন্যও।

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

>>> s.encode('zip')
'x\x9c;\xbc\r\x00\x02>\x01z'

যদিও আপনি ঠিক বলেছেন: এই অ্যাপ্লিকেশনটির জন্য "এনকোডিং" এর দ্ব্যর্থক ব্যবহারটি হ'ল ... অবাক। আবার পাইথন 3 এ পৃথক byteএবং stringপ্রকারের সাথে এটি আর সমস্যা নয় an


4
.decode()ইউনিকোড স্ট্রিংগুলিতে দরকারী হতে পারে উদাহরণস্বরূপprint u'\\u0203'.decode('unicode-escape')
jfs

অজগর 3 জেজেফেসেস্টিয়ান এর ভাল উদাহরণ আমি অনুমান করি আপনি এটি করবেন:print u'\\u0203'.encode('utf8').decode('unicode-escape')
এজেপি

1
@ এজেপি: পাইথন 3:codecs.decode(u'\\u0203', 'unicode-escape')
jfs

@ হপ: হ্যাঁ অবৈধ ইনপুট সনাক্ত করতে এবং পাইথন 2/3 সামঞ্জস্যের জন্য, স্ট্রিংটি asciiএনকোডিং ব্যবহার করে স্পষ্টভাবে এনকোড করা যেতে পারে :\\u0203\u00e4'.encode('ascii').decode('unicode-escape')
jfs

@ হুপ: আপনার প্রথম মন্তব্য (আপনি কেন এটি মুছে ফেলেছেন? যে মন্তব্যগুলিতে জবাব দেওয়া হয়েছে তা মুছবেন না) ইতিমধ্যে এটি বলেছে। আমার উত্তর ( .encode('ascii').decode('unicode-escape')) এর উপর নির্ভর করে না sys.getdefaultencoding()
jfs

71

কোনও ইউনিকোড স্ট্রিংকে বাইটের স্ট্রিং হিসাবে উপস্থাপন করা এনকোডিং হিসাবে পরিচিত । ব্যবহার u'...'.encode(encoding)

উদাহরণ:

    >>> u'æøå'.encode ('utf8')
    '\ Xc3 \ x83 \ xc2 \ xa6 \ xc3 \ x83 \ xc2 \ xb8 \ xc3 \ x83 \ xc2 \ xa5'
    >>> u'æøå'.encode ('latin1')
    '\ Xc3 \ xa6 \ xc3 \ xb8 \ xc3 \ xa5'
    >>> u'æøå'.encode ('ascii')
    ইউনিকোড এনকোডেরর: 'এসকিআই' কোডেক 0-5 পজিশনে অক্ষরগুলি এনকোড করতে পারে না: 
    সীমিত সীমানা নয় (128)

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

বাইটের একটি স্ট্রিংকে ইউনিকোড স্ট্রিংয়ে রূপান্তর করতে ডিকোডিং নামে পরিচিত । ব্যবহার করুন unicode('...', encoding)বা '...'। ডিকোড (এনকোডিং)।

উদাহরণ:

   >>> তুমি '
   u '\ xc3 \ xa6 \ xc3 \ xb8 \ xc3 \ xa5' # দোভাষী দের মত ইউনিকোড বস্তু মুদ্রণ করে
   >>> ইউনিকোড ('\ xc3 \ xa6 \ xc3 \ xb8 \ xc3 \ xa5', 'লাতিন 1')
   তোমার দর্শন লগ করা '\ xc3 \ xa6 \ xc3 \ xb8 \ xc3 \ xa5'
   >>> '\ xc3 \ xa6 \ xc3 \ xb8 \ xc3 \ xa5'.decode (' ল্যাটিন 1 ')
   তোমার দর্শন লগ করা '\ xc3 \ xa6 \ xc3 \ xb8 \ xc3 \ xa5'

আপনি যখনই নেটওয়ার্ক বা কোনও ডিস্ক ফাইল থেকে স্ট্রিং ডেটা পান আপনি সাধারণত বাইটের একটি স্ট্রিং ডিকোড করেন।

আমি বিশ্বাস করি অজগর 3 এ ইউনিকোড হ্যান্ডলিংয়ে কিছু পরিবর্তন হয়েছে, সুতরাং উপরোক্ত সম্ভবত পাইথন 3 এর জন্য সঠিক নয়।

কিছু ভাল লিঙ্ক:


6
আপনি ওপির প্রশ্নের উত্তর দেননি। ওপি স্ট্রিংকেনড () এবং ইউনিকোড.ডেকোড () কী করবে তা জানতে চায়। আপনি কেবল আসল প্রশ্নের মধ্যে যা বলা হয়েছিল তা পুনরাবৃত্তি করলেন।
স্টিঙ্কিনথশাক

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

চমত্কার উত্তর! এই উপরে যেতে হবে !!
স্যান্ডপ

16

anUnicode। এনকোড ('এনকোডিং') এর ফলে স্ট্রিং অবজেক্ট হয় এবং ইউনিকোড অবজেক্টে ডাকা যেতে পারে

aString। ডিকোড ('এনকোডিং') এর ফলে একটি ইউনিকোড অবজেক্ট আসে এবং প্রদত্ত এনকোডিংয়ে এনকোড করে স্ট্রিংয়ে ডাকা যেতে পারে।


আরও কিছু ব্যাখ্যা:

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

তবে একটি সময় আসে যখন আপনি আপনার ইউনিকোড অবজেক্টটি কনসোল বা মুদ্রণ করতে চান বা কোনও পাঠ্য ফাইলে। সুতরাং আপনাকে এটিকে এনকোড করতে হবে (উদাহরণস্বরূপ - ইউটিএফ -8 এ), আপনি এনকোডকে কল করুন ('utf-8') এবং আপনি ভিতরে ভিতরে \ <u <someNumber> 'স্ট্রিং পাবেন যা পুরোপুরি মুদ্রণযোগ্য।

তারপরে, আবার - আপনি বিপরীতটি করতে চান - ইউটিএফ -8 এ এনকোডেড স্ট্রিংটি পড়ুন এবং এটি ইউনিকোড হিসাবে বিবেচনা করুন, সুতরাং \ u360 একটি অক্ষর হবে, 5 নয় Then তারপরে আপনি একটি স্ট্রিং ডিকোড করুন (নির্বাচিত এনকোডিং সহ) এবং ইউনিকোড ধরণের ব্র্যান্ডের নতুন অবজেক্টটি পান।

পার্শ্ব নোট হিসাবে - আপনি কিছু 'বিকৃত এনকোডিং, যেমন' জিপ ',' বেস 64 ',' পচা 'নির্বাচন করতে পারেন এবং তাদের মধ্যে কিছু স্ট্রিং থেকে স্ট্রিংয়ে রূপান্তরিত করতে পারবেন তবে আমি বিশ্বাস করি যে সর্বাধিক সাধারণ ক্ষেত্রে এটি ইউটিএফ -8 জড়িত is / ইউটিএফ -16 এবং স্ট্রিং।


12

মাইবিয়েস্টেরিং.ইনকোড (সামকোডেক) এই মানগুলির জন্য অর্থবহ somecodec:

  • করুন Base64-
  • bz2
  • zlib
  • সম্মোহন
  • quopri
  • ROT13
  • string_escape
  • UU

আমি নিশ্চিত নই যে ইতিমধ্যে ডিকোডড ইউনিকোড পাঠ্যটি ডিকোডিংয়ের জন্য ভাল। যে কোনও এনকোডিং সহ চেষ্টা করে দেখে মনে হয় প্রথমে প্রথমে সিস্টেমের ডিফল্ট এনকোডিংটি দিয়ে এনকোড করার চেষ্টা করা হয়।


5

কয়েকটি এনকোডিং রয়েছে যেটি str / str থেকে ইউনিকোড থেকে ইউনিকোডে ডি-/ এনকোড করতে ব্যবহৃত হতে পারে। উদাহরণস্বরূপ বেস 64, হেক্স বা পচা 13। এগুলি কোডেক মডিউলে তালিকাবদ্ধ রয়েছে ।

সম্পাদনা:

একটি ইউনিকোড স্ট্রিংয়ের ডিকোড বার্তাটি সংশ্লিষ্ট এনকোড ক্রিয়াকলাপটিকে পূর্বাবস্থায় ফিরিয়ে আনতে পারে:

In [1]: u'0a'.decode('hex')
Out[1]: '\n'

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


1
-1: ডিকোড পদ্ধতিটি ইউনিকোড অবজেক্টে প্রয়োগ করা হচ্ছে না। পরিবর্তে, ডিকোড ক্রিয়াকলাপ শুরু হওয়ার আগে, ইউনিকোড অবজেক্টটি 'এসকিআই' বাইস্টেরিং হিসাবে এনকোড করা হচ্ছে। এই দৃ as়তার প্রমাণের জন্য, u'ã'.decode ('hex') চেষ্টা করুন - যা ইউনিকোড এনকোডেরর ফল দেয়
নসক্লো

2
@ ননস্ক্লো: আপনি ঠিক বলেছেন। আমি যা বলতে চাইছিলাম তা হ'ল ইউনিকোড অবজেক্টগুলির একটি ডিকোড () পদ্ধতি রয়েছে যাতে আপনি তাদের মধ্যেও অক্ষরযুক্ত-এনকোডিং-কোডেক প্রয়োগ করতে পারেন। এই সম্পূর্ণ অ-অক্ষর-এনকোডিং-ব্যবসায়টি এই ইন্টারফেসটিকে পাইথন <3 এ জগাখিচুড়ি করে তোলে

1

এর সহজ উত্তর হ'ল এগুলি একে অপরের একেবারে বিপরীত।

কম্পিউটার তথ্য সংরক্ষণ এবং প্রসেস করতে বাইটের খুব মৌলিক ইউনিট ব্যবহার করে; এটি মানুষের চোখের জন্য অর্থহীন।

উদাহরণস্বরূপ, '\ xe4 \ xb8 \ xad \ xe6 \ x96 \ x87' হ'ল দুটি চীনা বর্ণের উপস্থাপনা, তবে কম্পিউটার কেবল জানে (মুদ্রণ বা স্টোর বোঝায়) যখন এটির জন্য একটি অভিধান দেওয়া হয় তখন এটি চীনা অক্ষর হয় Characters চাইনিজ শব্দটি এই ক্ষেত্রে এটি একটি "ইউটিএফ -৮" অভিধান এবং আপনি যদি অন্যরকম বা ভুল অভিধানের (অন্য একটি ডিকোডিং পদ্ধতি ব্যবহার করে) সন্ধান করেন তবে এটি চাইনিজ শব্দটি সঠিকভাবে দেখাতে ব্যর্থ হবে।

উপরের ক্ষেত্রে, কম্পিউটারের জন্য চাইনিজ শব্দটির সন্ধানের প্রক্রিয়াটি decode()

কম্পিউটার কম্পিউটারে মেশিনে চীনা লেখার প্রক্রিয়াটি encode()

সুতরাং এনকোডযুক্ত তথ্য হ'ল কাঁচা বাইট, এবং ডিকোড করা তথ্য হ'ল কাঁচা বাইট এবং রেফারেন্সির জন্য অভিধানের নাম (তবে অভিধান নিজেই নয়)।

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