উত্তর:
পাইথন 3 ধরে নেওয়া (পাইথন 2 এ, এই পার্থক্যটি একটু কম সংজ্ঞাযুক্ত) - একটি স্ট্রিং অক্ষরগুলির ক্রম, অর্থাৎ ইউনিকোড কোডপয়েন্ট ; এগুলি একটি বিমূর্ত ধারণা, এবং সরাসরি ডিস্কে সংরক্ষণ করা যায় না। একটি বাইট স্ট্রিং, একটি ক্রম unsurprisingly, বাইট - যে জিনিস করতে ডিস্কে সংরক্ষণ করা। এগুলির মধ্যে ম্যাপিংটি একটি এনকোডিং - এগুলির মধ্যে প্রচুর পরিমাণ রয়েছে (এবং অসীমভাবে অনেকগুলিই সম্ভব) - এবং রূপান্তরটি করার জন্য নির্দিষ্ট ক্ষেত্রে কোনটি প্রযোজ্য তা আপনাকে জানতে হবে, কারণ কোনও ভিন্ন এনকোডিং একই বাইটগুলি ম্যাপ করতে পারে একটি ভিন্ন স্ট্রিং:
>>> b'\xcf\x84o\xcf\x81\xce\xbdo\xcf\x82'.decode('utf-16')
'蓏콯캁澽苏'
>>> b'\xcf\x84o\xcf\x81\xce\xbdo\xcf\x82'.decode('utf-8')
'τoρνoς'
আপনি কোনটি ব্যবহার করবেন তা জানার পরে .decode()
উপরের দিক থেকে সঠিক অক্ষরের স্ট্রিংটি পেতে আপনি বাইট স্ট্রিংয়ের পদ্ধতিটি ব্যবহার করতে পারেন । সম্পূর্ণতার জন্য, .encode()
একটি অক্ষরের স্ট্রিংয়ের পদ্ধতিটি বিপরীত পথে যায়:
>>> 'τoρνoς'.encode('utf-8')
b'\xcf\x84o\xcf\x81\xce\xbdo\xcf\x82'
str
অবজেক্টের মেমরির উপস্থাপনা পাইথন দিক থেকে অ্যাক্সেসযোগ্য বা প্রাসঙ্গিক নয়; তথ্য কাঠামো কোডপয়েন্টগুলির একটি ক্রম মাত্র। পিইপি 393 এর অধীনে সঠিক অভ্যন্তরীণ এনকোডিংটি ল্যাটিন -1, ইউসিএস 2 বা ইউসিএস 4 এর মধ্যে একটি এবং প্রথম অনুরোধের পরে একটি utf-8 প্রতিনিধিত্ব ক্যাশে করা যেতে পারে, তবে সি কোডও এই অভ্যন্তরীণ বিবরণগুলির উপর নির্ভর করা থেকে নিরুৎসাহিত করা হয়।
বাইটস হ'ল কম্পিউটার কেবলমাত্র জিনিস সংরক্ষণ করতে পারে।
কম্পিউটারে যে কোনও কিছু সঞ্চয় করতে, আপনাকে প্রথমে এটি এনকোড করতে হবে, অর্থাত এটিকে বাইটে রূপান্তর করতে হবে। উদাহরণ স্বরূপ:
MP3
, WAV
ইত্যাদিPNG
, JPEG
ইত্যাদিASCII
, UTF-8
ইত্যাদিMP3
, WAV
, PNG
, JPEG
, ASCII
এবং UTF-8
উদাহরণ এনকোডিং । একটি এনকোডিং অডিও, চিত্রগুলি, পাঠ্য, ইত্যাদি বাইটে উপস্থাপন করার জন্য একটি ফর্ম্যাট।
পাইথনে, একটি বাইট স্ট্রিং ঠিক এটি: বাইটের ক্রম। এটি মানব-পঠনযোগ্য নয়। হুডের নীচে, কম্পিউটারে সঞ্চয় করার আগে সবকিছুকে বাইট স্ট্রিংয়ে রূপান্তর করতে হবে।
অন্যদিকে, একটি চরিত্রের স্ট্রিং, যা প্রায়শই "স্ট্রিং" নামে পরিচিত, এটি অক্ষরের ক্রম। এটি মানব-পঠনযোগ্য। একটি অক্ষরে স্ট্রিং সরাসরি কম্পিউটারে সংরক্ষণ করা যায় না, এটি প্রথমে এনকোড করতে হয় (বাইট স্ট্রিংয়ে রূপান্তরিত)। এখানে একাধিক এনকোডিং রয়েছে যার মাধ্যমে একটি অক্ষর স্ট্রিংকে বাইট স্ট্রিংয়ে রূপান্তর করা যায়, যেমন ASCII
এবং UTF-8
।
'I am a string'.encode('ASCII')
উপরের পাইথন কোডটি 'I am a string'
এনকোডিং ব্যবহার করে স্ট্রিংটিকে এনকোড করবে ASCII
। উপরের কোডের ফলাফলটি একটি বাইট স্ট্রিং হবে। আপনি যদি এটি মুদ্রণ করেন তবে পাইথন এটি হিসাবে উপস্থাপন করবে b'I am a string'
। তবে মনে রাখবেন যে বাইট স্ট্রিংগুলি মানব-পঠনযোগ্য নয় , ASCII
আপনি যখন প্রিন্ট করেন তখন পাইথন সেগুলি ডিকোড করে। পাইথনে, বাইট স্ট্রিংটি একটি দ্বারা প্রতিনিধিত্ব করা হয় b
, তারপরে বাইট স্ট্রিংয়ের ASCII
উপস্থাপনা।
বাইট স্ট্রিংটি আবার কোনও অক্ষরের স্ট্রিংয়ে ডিকোড করা যায়, যদি আপনি এনকোডিংয়ের জন্য ব্যবহৃত এনকোডিংটি জানেন।
b'I am a string'.decode('ASCII')
উপরের কোডটি মূল স্ট্রিংটি ফিরিয়ে দেবে 'I am a string'
।
এনকোডিং এবং ডিকোডিং বিপরীত ক্রিয়াকলাপ। এটি ডিস্কে লেখার আগে অবশ্যই সমস্ত কিছু এনকোড করা উচিত এবং এটি কোনও মানুষের দ্বারা পড়ার আগে অবশ্যই এটি ডিকোড করা উচিত।
দ্রষ্টব্য: পাইথন 2-এর জীবনের সমাপ্তি খুব নিকটবর্তী হওয়ায় আমি পাইথন 3 এর জন্য আমার উত্তরটি আরও বিস্তারিতভাবে জানাব।
পাইথন 3 এ
bytes
8-বিট স্বাক্ষরযুক্ত মানগুলির str
সিকোয়েন্সগুলি নিয়ে গঠিত হয় , যখন ইউনিকোড কোড পয়েন্টগুলির ক্রমগুলি থাকে যা মানব ভাষা থেকে পাঠ্য অক্ষরের প্রতিনিধিত্ব করে।
>>> # bytes
>>> b = b'h\x65llo'
>>> type(b)
<class 'bytes'>
>>> list(b)
[104, 101, 108, 108, 111]
>>> print(b)
b'hello'
>>>
>>> # str
>>> s = 'nai\u0308ve'
>>> type(s)
<class 'str'>
>>> list(s)
['n', 'a', 'i', '̈', 'v', 'e']
>>> print(s)
naïve
যদিও bytes
এবং str
একইভাবে কাজ করে বলে মনে হচ্ছে, তাদের দৃষ্টান্তগুলি একে অপরের সাথে সামঞ্জস্যপূর্ণ নয়, bytes
এবং str
উদাহরণগুলি অপারেটরের মতো >
এবং এর সাথে একসাথে ব্যবহার করা যায় না +
। এছাড়াও, মনে রাখবেন যে তুলনা bytes
এবং str
সমতার জন্য উদাহরণস্বরূপ, ব্যবহার করা ==
, সর্বদা মূল্যায়ন করবে False
এমনকি যখন তারা ঠিক একই অক্ষর ধারণ করে।
>>> # concatenation
>>> b'hi' + b'bye' # this is possible
b'hibye'
>>> 'hi' + 'bye' # this is also possible
'hibye'
>>> b'hi' + 'bye' # this will fail
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can't concat str to bytes
>>> 'hi' + b'bye' # this will also fail
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can only concatenate str (not "bytes") to str
>>>
>>> # comparison
>>> b'red' > b'blue' # this is possible
True
>>> 'red'> 'blue' # this is also possible
True
>>> b'red' > 'blue' # you can't compare bytes with str
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: '>' not supported between instances of 'bytes' and 'str'
>>> 'red' > b'blue' # you can't compare str with bytes
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: '>' not supported between instances of 'str' and 'bytes'
>>> b'blue' == 'red' # equality between str and bytes always evaluates to False
False
>>> b'blue' == 'blue' # equality between str and bytes always evaluates to False
False
বিল্ট-ইন ফাংশনটি ব্যবহার করে ফিরে আসা ফাইলগুলির সাথে কাজ করার সময় bytes
এবং str
উপস্থিত থাকার সাথে আরেকটি সমস্যা open
। একদিকে আপনি যদি কোনও ফাইলের কাছে / থেকে বাইনারি ডেটা পড়তে বা লিখতে চান তবে সর্বদা 'rb' বা 'wb' এর মতো বাইনারি মোড ব্যবহার করে ফাইলটি খুলুন। অন্যদিকে, আপনি যদি কোনও ফাইল থেকে / থেকে ইউনিকোড ডেটা পড়তে বা লিখতে চান তবে আপনার কম্পিউটারের ডিফল্ট এনকোডিং সম্পর্কে সচেতন হন, সুতরাং প্রয়োজনে encoding
অবাক হওয়ার এড়াতে প্যারামিটারটি পাস করুন ।
পাইথন 2 এ
str
8-বিট মানগুলির unicode
সিকোয়েন্সগুলি নিয়ে গঠিত , যখন ইউনিকোড অক্ষরের ক্রম থাকে। একটি জিনিস মনে রাখবেন তা হ'ল str
এবং unicode
অপারেটরগুলির সাথে একসাথে ব্যবহার করা যেতে পারে যদি str
কেবল 7-বিট ASCI অক্ষর থাকে।
পাইথন 2 এর মধ্যে এবং পাইথন 3 এর মধ্যে str
এবং রূপান্তর করতে সহায়ক ফাংশনগুলি ব্যবহার করা দরকারী ।unicode
bytes
str
ইউনিকোড কি থেকে :
মূলত, কম্পিউটারগুলি কেবল সংখ্যার সাথে ডিল করে। তারা প্রত্যেকের জন্য একটি নম্বর বরাদ্দ করে অক্ষর এবং অন্যান্য অক্ষর সংরক্ষণ করে।
......
ইউনিকোড প্রতিটি চরিত্রের জন্য একটি অনন্য নম্বর সরবরাহ করে, প্ল্যাটফর্ম যাই হোক না কেন, প্রোগ্রাম যাই হোক না কেন, ভাষা যাই হোক না কেন।
সুতরাং যখন কোনও কম্পিউটার কোনও স্ট্রিং উপস্থাপন করে, তখন তারা স্ট্রিংয়ের কম্পিউটারে স্বতন্ত্র ইউনিকোড সংখ্যার মাধ্যমে সঞ্চিত অক্ষরগুলি আবিষ্কার করে এবং এই চিত্রগুলি মেমরিতে সংরক্ষণ করা হয়। তবে আপনি সরাসরি ডিস্কে স্ট্রিং লিখতে বা তাদের অনন্য ইউনিকোড সংখ্যার মাধ্যমে নেটওয়ার্কে স্ট্রিং সংক্রমণ করতে পারবেন না কারণ এই পরিসংখ্যান কেবলমাত্র দশমিক সংখ্যা। বাইট স্ট্রিংয়ের মতো আপনার স্ট্রিংটিকে এনকোড করা উচিত UTF-8
। UTF-8
একটি অক্ষর সব সম্ভব অক্ষর এনকোডিং করতে সক্ষম এনকোডিং এবং এটি বাইট (এটা দেখে মনে হচ্ছে হিসাবে অক্ষর সঞ্চয় করে এই )। সুতরাং এনকোডযুক্ত স্ট্রিংটি সর্বত্র ব্যবহৃত হতে পারে কারণ UTF-8
প্রায় সর্বত্র সমর্থিত। আপনি যখন এনকোডযুক্ত একটি পাঠ্য ফাইল খুলবেনUTF-8
অন্যান্য সিস্টেম থেকে আপনার কম্পিউটার এটিকে ডিকোড করবে এবং অক্ষরগুলি তাদের অনন্য ইউনিকোড নম্বরের মাধ্যমে প্রদর্শন করবে। যখন কোনও ব্রাউজার UTF-8
নেটওয়ার্ক থেকে এনকোডযুক্ত স্ট্রিং ডেটা গ্রহণ করে , তখন এটি ডেটাটি স্ট্রিংয়ে ডিকোড করে দেবে (ব্রাউজারটিকে UTF-8
এনকোডিং হিসাবে ধরে রাখে ) এবং স্ট্রিংটি প্রদর্শন করে।
পাইথন 3 এ, আপনি একে অপরের সাথে স্ট্রিং এবং বাইট স্ট্রিং রূপান্তর করতে পারেন:
>>> print('中文'.encode('utf-8'))
b'\xe4\xb8\xad\xe6\x96\x87'
>>> print(b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8'))
中文
এক কথায় স্ট্রিং হ'ল কম্পিউটারে পড়ার জন্য মানুষের দেখানোর জন্য এবং বাইট স্ট্রিংটি ডিস্কে এবং ডেটা সংক্রমণে সঞ্চয় করার জন্য।
ইউনিকোড হ'ল অক্ষরের বাইনারি উপস্থাপনা এবং বিভিন্ন ধরণের বিন্যাসের (যেমন লোয়ার কেস / আপার কেস, নতুন লাইন, ক্যারেজ রিটার্ন) এবং অন্যান্য "জিনিস" (যেমন ইমোজিস) এর একমত বিন্যাস। মেমোরিতে বা কোনও ফাইলের মধ্যে একটি কম্পিউটার ইউনিকোড উপস্থাপনা (বিটগুলির একটি সিরিজ) সংরক্ষণ করার চেয়ে কম সক্ষম নয়, এটি আসকি উপস্থাপনা (বিটের বিভিন্ন ধারাবাহিক) বা অন্য কোনও উপস্থাপনা (বিটের সিরিজ) সংরক্ষণ করার চেয়ে কম )।
যোগাযোগের জন্য, যোগাযোগের পক্ষগুলিকে কোন প্রতিনিধিত্ব ব্যবহার করা হবে সে সম্পর্কে অবশ্যই একমত হতে হবে।
কারণ ইউনিকোড সকলের প্রতিনিধিত্ব করতে চায় আন্তঃ মানব এবং আন্তঃ কম্পিউটার যোগাযোগে ব্যবহৃত সম্ভাব্য অক্ষর (এবং অন্যান্য "জিনিস") অন্যান্য প্রতিনিধিত্বমূলক সিস্টেমের তুলনায় অনেক অক্ষরের (বা জিনিস) উপস্থাপনের জন্য এটির বৃহত্তর সংখ্যক বিট প্রয়োজন অক্ষর / জিনিসগুলির আরও সীমাবদ্ধ সেট উপস্থাপন করার চেষ্টা করুন। "সরলকরণ" এবং সম্ভবত historicalতিহাসিক ব্যবহারের সামঞ্জস্য রাখতে, ফাইলগুলিতে অক্ষর সংরক্ষণের উদ্দেশ্যে ইউনিকোড উপস্থাপনাটি প্রায় কোনও একচেটিয়াভাবে উপস্থাপনের অন্যান্য সিস্টেমে রূপান্তরিত হয় (যেমন ascii)।
এটা দেখা যায় ইউনিকোড নয় না পারেন ফাইলের মধ্যে অক্ষর সংরক্ষণকারী, অথবা মাধ্যমে তাদের প্রেরণের জন্য ব্যবহার করা যেতে কোনো যোগাযোগ চ্যানেল, কেবল এটি হয় না।
"স্ট্রিং" শব্দটি নিখুঁতভাবে সংজ্ঞায়িত হয়নি। "স্ট্রিং" এর সাধারণ ব্যবহারে অক্ষর / জিনিসগুলির সেটকে বোঝায়। একটি কম্পিউটারে, এই অক্ষরগুলি বিট-বিট বিট উপস্থাপনার মধ্যে যে কোনও একটিতে সঞ্চিত থাকতে পারে। একটি "বাইট স্ট্রিং" হ'ল আটটি বিট (আটটি বিটকে বাইট হিসাবে উল্লেখ করা হয়) ব্যবহার করে এমন উপস্থাপনা ব্যবহার করে সংরক্ষণ করা অক্ষরের একটি সেট। যেহেতু, আজকাল কম্পিউটারগুলি মেমোরিতে অক্ষরগুলি সংরক্ষণ করতে ইউনিকোড সিস্টেম (অক্ষরগুলির একটি পরিবর্তনশীল সংখ্যা দ্বারা চিহ্নিত অক্ষর) এবং ফাইলগুলিতে অক্ষরগুলি সংরক্ষণ করার জন্য বাইট স্ট্রিংগুলি (একক বাইট দ্বারা চিহ্নিত অক্ষর) ব্যবহার করা হয়, তাই অক্ষরের প্রতিনিধিত্ব করার আগে একটি রূপান্তর ব্যবহার করা আবশ্যক মেমরি ফাইলের স্টোরেজে সরানো হবে।
আসুন একটি সাধারণ এক-চরিত্রের স্ট্রিং থাকি 'š'
এবং এটিকে বাইটের ক্রমে এনকোড করি:
>>> 'š'.encode('utf-8')
b'\xc5\xa1'
এই উদাহরণের উদ্দেশ্যে, আসুন এর বাইনারি আকারে বাইটের ক্রমটি প্রদর্শন করা যাক:
>>> bin(int(b'\xc5\xa1'.hex(), 16))
'0b1100010110100001'
এখন তথ্য কীভাবে এনকোড করা হয়েছিল তা না জেনে ফিরতি ডিকোড করা সম্ভব হয় না । কেবলমাত্র যদি আপনি জানেন যে utf-8
পাঠ্য এনকোডিংটি ব্যবহৃত হয়েছিল, আপনি utf-8 ডিকোডিংয়ের জন্য অ্যালগরিদমটি অনুসরণ করতে পারেন এবং মূল স্ট্রিংটি অর্জন করতে পারেন:
11000101 10100001
^^^^^ ^^^^^^
00101 100001
আপনি বাইনারি নম্বরটি 101100001
স্ট্রিং হিসাবে প্রদর্শন করতে পারেন :
>>> chr(int('101100001', 2))
'š'
পাইথন ভাষায় অন্তর্ভুক্ত str
এবং bytes
মান হিসাবে "বিল্ট-ইন প্রকারভেদ"। অন্য কথায়, তারা উভয় শ্রেণি। পাইথনকে এভাবে কেন প্রয়োগ করা হয়েছে তা যুক্তিযুক্ত করার চেষ্টা করা সার্থক বলে আমি মনে করি না।
যে বলেছে, str
এবং bytes
একে অপরের সাথে খুব মিল। উভয়ই একই পদ্ধতিতে বেশিরভাগ অংশীদার হয়। নিম্নলিখিত পদ্ধতিগুলি str
শ্রেণীর জন্য অনন্য :
casefold
encode
format
format_map
isdecimal
isidentifier
isnumeric
isprintable
নিম্নলিখিত পদ্ধতিগুলি bytes
শ্রেণীর জন্য অনন্য :
decode
fromhex
hex
str
টাইপটিbytes
ধরণের হিসাবে একই ; এই উত্তরটি সমানভাবেunicode
টাইপের সাথে (পাইথন 3 তে বিদ্যমান নেই) টাইপের সাথে তুলনা করেstr
।