এই জাতীয় এনকোডিং সমস্যার পুরো কীটি বুঝতে হবে যে নীতিগতভাবে "স্ট্রিং" এর দুটি স্বতন্ত্র ধারণা রয়েছে : (1) অক্ষরের স্ট্রিং , এবং (2) স্ট্রিং / বাইটের অ্যারে। 256 টির বেশি অক্ষরবিহীন এনকোডিংগুলির uতিহাসিক সর্বব্যাপীতার কারণে এই পার্থক্যটি বেশিরভাগ সময় ধরে উপেক্ষা করা হয়েছে (এএসসিআইআই, ল্যাটিন -১, উইন্ডোজ -১২২২, ম্যাক ওএস রোমান, ...): এই এনকোডিংগুলি সাধারণ অক্ষরের একটি সেটকে ম্যাপ করে 0 এবং 255 (অর্থাত্ বাইট) এর মধ্যে সংখ্যা; ওয়েবের আবির্ভাবের আগে ফাইলগুলির অপেক্ষাকৃত সীমিত বিনিময়টি বেমানান এনকোডিংগুলির এই পরিস্থিতিকে সহনীয় করে তুলেছিল, কারণ বেশিরভাগ প্রোগ্রাম একই অপারেটিং সিস্টেমে থাকা টেক্সট তৈরি করে যতক্ষণ না একাধিক এনকোডিং থাকত এ বিষয়টি উপেক্ষা করতে পারে: এই জাতীয় প্রোগ্রামগুলি সহজভাবে বাইট হিসাবে টেক্সট আচরণ (অপারেটিং সিস্টেম দ্বারা ব্যবহৃত এনকোডিং মাধ্যমে)। সঠিক, আধুনিক দৃষ্টিভঙ্গি নিম্নলিখিত দুটি পয়েন্টের উপর ভিত্তি করে এই দুটি স্ট্রিং ধারণাটি যথাযথভাবে পৃথক করেছে:
অক্ষরগুলি বেশিরভাগ কম্পিউটারের সাথে সম্পর্কিত নয় : উদাহরণস্বরূপ بايثون, 中 蟒 এবং 🐍 এর মতো একটি এটি একটি খড়ি বোর্ড ইত্যাদিতে আঁকতে পারে 🐍 মেশিনগুলির "অক্ষর" এর মধ্যে "অঙ্কন নির্দেশাবলী" অন্তর্ভুক্ত থাকে যেমন উদাহরণস্বরূপ স্পেস, ক্যারেজ রিটার্ন, লেখার দিকনির্ধারণের নির্দেশাবলী (আরবি ইত্যাদির জন্য) ইত্যাদি, অ্যাকসেন্ট ইত্যাদি A ইউনিকোড স্ট্যান্ডার্ডের মধ্যে একটি খুব বড় চরিত্রের তালিকা অন্তর্ভুক্ত ; এটি বেশিরভাগ পরিচিত চরিত্রগুলি জুড়ে covers
অন্যদিকে, কম্পিউটারগুলিকে কোনও উপায়ে বিমূর্ত অক্ষরগুলি উপস্থাপন করা দরকার: এর জন্য তারা বাইটের অ্যারে ব্যবহার করে (0 থেকে 255 এর মধ্যে সংখ্যাগুলি অন্তর্ভুক্ত), কারণ তাদের স্মৃতি বাইট খণ্ডে আসে। অক্ষরকে বাইটে রূপান্তরিত করে এমন প্রয়োজনীয় প্রক্রিয়াটিকে এনকোডিং বলা হয় । সুতরাং, কম্পিউটারের অক্ষর উপস্থাপনের জন্য একটি এনকোডিং প্রয়োজন । আপনার কম্পিউটারে উপস্থিত যে কোনও পাঠ্য এনকোডড রয়েছে (এটি প্রদর্শিত না হওয়া অবধি), এটি কোনও টার্মিনালে প্রেরণ করা হয়েছে (যা একটি নির্দিষ্ট উপায়ে এনকোড করা অক্ষরগুলির প্রত্যাশা করে) বা কোনও ফাইলে সংরক্ষণ করা হয়। প্রদর্শিত বা সঠিকভাবে "বোঝার" জন্য (পাইথন ইন্টারপ্রেটার দ্বারা, বলুন), বাইটগুলির স্রোতগুলিকে অক্ষরগুলিতে ডিকোড করা হয়। কয়েকটি এনকোডিং(ইউটিএফ -8, ইউটিএফ -16,…) এর অক্ষরগুলির তালিকা জন্য ইউনিকোড দ্বারা সংজ্ঞায়িত করা হয়েছে (ইউনিকোড এভাবে এই অক্ষরগুলির জন্য অক্ষরগুলির একটি তালিকা এবং এনকোডিং উভয়ই সংজ্ঞায়িত করে — এখনও এমন জায়গা রয়েছে যেখানে কেউ "ইউনিকোড এনকোডিং" হিসাবে অভিব্যক্তিটি দেখেছেন সর্বব্যাপী ইউটিএফ -8 উল্লেখ করার উপায়, তবে এটি ভুল পরিভাষা, যেমন ইউনিকোড একাধিক এনকোডিং সরবরাহ করে)।
সংক্ষেপে, কম্পিউটারগুলির অভ্যন্তরীণভাবে বাইটগুলি সহ অক্ষরগুলি উপস্থাপন করা প্রয়োজন এবং তারা দুটি ক্রিয়াকলাপের মাধ্যমে এটি করে:
এনকোডিং : অক্ষর → বাইট
ডিকোডিং : বাইটস → অক্ষর
কিছু এনকোডিং সমস্ত অক্ষরকে এনকোড করতে পারে না (যেমন, ASCII), (কিছু) ইউনিকোড এনকোডিংগুলি আপনাকে সমস্ত ইউনিকোড অক্ষর এনকোড করার অনুমতি দেয়। এনকোডিং অগত্যা অনন্যও নয় , কারণ কিছু অক্ষর প্রত্যক্ষভাবে বা সংমিশ্রণ হিসাবে উপস্থাপিত হতে পারে (যেমন একটি বেস চরিত্র এবং অ্যাকসেন্টের উদাহরণস্বরূপ)।
নোট করুন যে নিউলাইন ধারণাটি জটিলতার একটি স্তর যুক্ত করে , যেহেতু এটি অপারেটিং সিস্টেমের উপর নির্ভরশীল বিভিন্ন (নিয়ন্ত্রণ) অক্ষর দ্বারা প্রতিনিধিত্ব করা যেতে পারে (এটি পাইথনের সর্বজনীন নিউলাইন ফাইল রিডিং মোডের কারণ )।
এখন, আমি উপরে "অক্ষর" বলেছি যা ইউনিকোডকে " ব্যবহারকারী-অনুভূত চরিত্র " বলে। ইউনিকোড তালিকার বিভিন্ন সূচীতে পাওয়া অক্ষরের অংশসমূহ (বেস অক্ষর, অ্যাকসেন্টস,…) একত্রিত করে একটি ইউজার-বোধিত অক্ষরকে ইউনিকোডে প্রতিনিধিত্ব করা যেতে পারে , যা " কোড পয়েন্ট " নামে পরিচিত - এই কোড পয়েন্টগুলি একত্রিত করে গঠন করতে পারে একটি "গ্রাফি ক্লাস্টার"। ইউনিকোড এভাবে স্ট্রিংয়ের তৃতীয় ধারণার দিকে নিয়ে যায় যা ইউনিকোড কোড পয়েন্টের ক্রম দিয়ে তৈরি হয়, যা বাইট এবং চরিত্রের স্ট্রিংগুলির মধ্যে বসে থাকে এবং এটি পরবর্তীটির কাছাকাছি থাকে। আমি তাদের " ইউনিকোড স্ট্রিংস " বলব (পাইথন 2 এর মতো)।
পাইথন অক্ষরগুলির স্ট্রিং (ব্যবহারকারী-অনুভূত) মুদ্রণ করতে পারে, পাইথন নন-বাইট স্ট্রিংগুলি ইউনিকোড কোড পয়েন্টগুলির মূলত ক্রম , ব্যবহারকারীর দ্বারা উপলব্ধ অক্ষরের নয়। কোড পয়েন্টের মানগুলি পাইথন \u
এবং \U
ইউনিকোড স্ট্রিং সিনট্যাক্সে ব্যবহৃত হয় । কোনও চরিত্রের এনকোডিংয়ের সাথে তাদের বিভ্রান্ত করা উচিত নয় (এবং এর সাথে কোনও সম্পর্ক বহন করতে হবে না: ইউনিকোড কোড পয়েন্টগুলি বিভিন্ন উপায়ে এনকোড করা যেতে পারে)।
এটি একটি গুরুত্বপূর্ণ ফল আছে: একটি পাইথন (ইউনিকোড) স্ট্রিং এর দৈর্ঘ্য কোড পয়েন্ট তার সংখ্যা, যার হয় না সবসময় ব্যবহারকারী-অনুভূত অক্ষরের তার সংখ্যা এইভাবে: s = "\u1100\u1161\u11a8"; print(s, "len", len(s))
(পাইথন 3) দেয় 각 len 3
সত্ত্বেও s
একটি একক ব্যবহারকারী-অনুভূত (কোরিয়ান) এটি অক্ষর (কারণ এটি 3 কোড পয়েন্টের সাথে উপস্থাপিত — এমনকি এটির যেমন print("\uac01")
শো-তে না হয়)। যাইহোক, অনেক ব্যবহারিক পরিস্থিতিতে স্ট্রিংয়ের দৈর্ঘ্য হ'ল এটি ব্যবহারকারী-অনুভূত অক্ষরের সংখ্যা, কারণ অনেকগুলি অক্ষর সাধারণত পাইথন একটি একক ইউনিকোড কোড পয়েন্ট হিসাবে সংরক্ষণ করে।
ইন পাইথন 2 , ইউনিকোড স্ট্রিং বলা হয় ... "ইউনিকোড স্ট্রিং" ( unicode
ধরন, আক্ষরিক ফর্ম u"…"
), এবং বাইট অ্যারে "স্ট্রিং" (হয় str
ধরন, যেখানে বাইট অ্যারে উদাহরণস্বরূপ স্ট্রিং লিটারেল দিয়ে অঙ্কণ করা সম্ভব "…"
)। ইন পাইথন 3 , ইউনিকোড স্ট্রিং শুধু "স্ট্রিং" (বলা হয় str
ধরন, আক্ষরিক ফর্ম "…"
,) যখন বাইট অ্যারে "বাইট" (হয় bytes
ধরন, আক্ষরিক ফর্ম b"…"
)। ফলস্বরূপ, এর মতো কিছু "🐍"[0]
পাইথন 2 ( '\xf0'
, একটি বাইট) এবং পাইথন 3 ( "🐍"
প্রথম এবং একমাত্র চরিত্র) এ আলাদা ফলাফল দেয় ।
এই কয়েকটি মূল পয়েন্টের সাহায্যে আপনার বেশিরভাগ এনকোডিং সম্পর্কিত প্রশ্নগুলি বুঝতে সক্ষম হওয়া উচিত!
সাধারণত আপনি যখন কোনও টার্মিনালে মুদ্রণ করেন তখন আপনার আবর্জনা ফেলা উচিত নয়: পাইথন আপনার টার্মিনালের এনকোডিংটি জানে। আসলে, আপনি টার্মিনালটি কী এনকোডিংয়ের প্রত্যাশা করে তা পরীক্ষা করতে পারেন:u"…"
% python
Python 2.7.6 (default, Nov 15 2013, 15:20:37)
[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.2.79)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> print sys.stdout.encoding
UTF-8
যদি আপনার ইনপুট অক্ষরগুলি টার্মিনালের এনকোডিংয়ের সাথে এনকোড করা যায় তবে পাইথন তা করবে এবং কোনও অভিযোগ না করে আপনার টার্মিনালে সংশ্লিষ্ট বাইটগুলি প্রেরণ করবে। টার্মিনাল তারপরে ইনপুট বাইটগুলি ডিকোড করার পরে অক্ষরগুলি প্রদর্শনের জন্য যথাসাধ্য চেষ্টা করবে (সবচেয়ে খারাপভাবে টার্মিনাল ফন্টে কিছু অক্ষর নেই এবং পরিবর্তে কিছু প্রকার ফাঁকা মুদ্রণ করা হবে)।
যদি আপনার ইনপুট অক্ষরগুলি টার্মিনালের এনকোডিংয়ের সাথে এনকোড করা যায় না, তবে এর অর্থ হ'ল এই অক্ষরগুলি প্রদর্শনের জন্য টার্মিনালটি কনফিগার করা হয়নি। পাইথন অভিযোগ করবে (পাইথনের সাথে UnicodeEncodeError
যেহেতু অক্ষরের স্ট্রিংটি এমনভাবে এনকোড করা যায় না যেটি আপনার টার্মিনালের সাথে মানানসই)। একমাত্র সম্ভাব্য সমাধান হ'ল একটি টার্মিনাল ব্যবহার করা যা অক্ষরগুলি প্রদর্শন করতে পারে (হয় টার্মিনালটি কনফিগার করে যাতে এটি এমন একটি এনকোডিং গ্রহণ করে যা আপনার অক্ষরগুলিকে উপস্থাপন করতে পারে, বা কোনও ভিন্ন টার্মিনাল প্রোগ্রাম ব্যবহার করে)। আপনি যখন বিভিন্ন পরিবেশে ব্যবহার করা যেতে পারে এমন প্রোগ্রামগুলি বিতরণ করেন তখন এটি গুরুত্বপূর্ণ: আপনি যে মুদ্রণগুলি মুদ্রণ করেন তা ব্যবহারকারীর টার্মিনালে উপস্থাপনযোগ্য হওয়া উচিত। কখনও কখনও স্ট্রিংগুলিতে লেগে থাকা ভাল তবে কেবল ASCII অক্ষর রয়েছে।
যাইহোক, আপনি যখন আপনার প্রোগ্রামের আউটপুটটিকে পুনঃনির্দেশিত করেন বা পাইপ করেন , তখন সাধারণত প্রাপ্তি প্রোগ্রামের ইনপুট এনকোডিংটি কী তা জানা সম্ভব নয় এবং উপরের কোডটি কিছু ডিফল্ট এনকোডিং দেয়: কিছুই নেই (পাইথন ২.7) বা ইউটিএফ -৮ ( পাইথন 3):
% python2.7 -c "import sys; print sys.stdout.encoding" | cat
None
% python3.4 -c "import sys; print(sys.stdout.encoding)" | cat
UTF-8
স্টিন, স্টডআউট এবং স্ট্ডার এর এনকোডিং তবে প্রয়োজনে পরিবেশের পরিবর্তনশীল মাধ্যমে নির্ধারণ করা যেতে পারে PYTHONIOENCODING
:
% PYTHONIOENCODING=UTF-8 python2.7 -c "import sys; print sys.stdout.encoding" | cat
UTF-8
যদি কোনও টার্মিনালে মুদ্রণ আপনি যা প্রত্যাশা করেন তা উত্পাদিত না করে আপনি নিজে ইউটিএফ -8 এনকোডিং যা আপনি ম্যানুয়ালি রেখেছিলেন তা সঠিকভাবে পরীক্ষা করতে পারেন; উদাহরণস্বরূপ, যদি আপনার ভুল না হয় তবে আপনার প্রথম অক্ষর ( \u001A
) মুদ্রণযোগ্য নয় ।
এ http://wiki.python.org/moin/PrintFails , আপনি পাইথন 2.x জন্য নিচের মত একটি সমাধান, পেতে পারবেন:
import codecs
import locale
import sys
# Wrap sys.stdout into a StreamWriter to allow writing unicode.
sys.stdout = codecs.getwriter(locale.getpreferredencoding())(sys.stdout)
uni = u"\u001A\u0BC3\u1451\U0001D10C"
print uni
পাইথন 3 এর জন্য, আপনি স্ট্যাকওভারফ্লোতে পূর্বে জিজ্ঞাসিত প্রশ্নগুলির একটি চেক করতে পারেন ।