আপনি এনকোডিং সহ সাধারণ সমস্যা নিয়ে হোঁচট খেয়েছেন: ফাইলটি কোন এনকোডিংয়ে রয়েছে তা আমি কীভাবে বলতে পারি?
উত্তরঃ তুমি পারবে না যদি না ফাইল ফরম্যাট এই জন্য প্রদান করে। এক্সএমএল, উদাহরণস্বরূপ, এর মাধ্যমে শুরু হয়:
<?xml encoding="utf-8"?>
এই শিরোনামটি সাবধানতার সাথে বেছে নেওয়া হয়েছে যাতে এটি এনকোডিংয়ের কোনও বিষয়ই পড়তে পারা যায়। আপনার ক্ষেত্রে, এই জাতীয় কোনও ইঙ্গিত নেই, তাই আপনার সম্পাদক বা পাইথন উভয়েরই ধারণা নেই যে কি চলছে। অতএব, আপনাকে অবশ্যই codecs
মডিউলটি ব্যবহার এবং ব্যবহার করতে হবেcodecs.open(path,mode,encoding)
যা পাইথনে অনুপস্থিত বিট সরবরাহ করে।
আপনার সম্পাদক হিসাবে, আপনার অবশ্যই এটি পরীক্ষা করা উচিত যে এটি কোনও ফাইলের এনকোডিং সেট করার কোনও উপায় সরবরাহ করে।
ইউটিএফ -8 এর পয়েন্টটি 21-বিট অক্ষরগুলি (ইউনিকোড) একটি 8-বিট ডেটা স্ট্রিম হিসাবে এনকোড করতে সক্ষম হতে হবে (কারণ এটিই পৃথিবীর সমস্ত কম্পিউটার পরিচালনা করতে পারে। তবে যেহেতু বেশিরভাগ ওএসগুলি ইউনিকোড যুগের পূর্বাভাস দেয়, তাই হার্ড ডিস্কের ফাইলগুলিতে এনকোডিংয়ের তথ্য সংযুক্ত করার জন্য তাদের কাছে উপযুক্ত সরঞ্জাম নেই।
পরের সংখ্যাটি পাইথনের উপস্থাপনা। এটি হাইকোজারল্যাচের মন্তব্যে পুরোপুরি ব্যাখ্যা করা হয়েছে । আপনার অবশ্যই বুঝতে হবে যে আপনার কনসোলটি কেবলমাত্র ASCII প্রদর্শন করতে পারে। ইউনিকোড বা যেকোন কিছুই> = চারকোড 128 প্রদর্শন করতে, অবশ্যই তাকে পালানোর কিছু উপায় ব্যবহার করতে হবে। আপনার সম্পাদকটিতে, আপনাকে অবশ্যই পালানো ডিসপ্লে স্ট্রিংটি টাইপ করতে হবে না তবে স্ট্রিংটির অর্থ কী (এই ক্ষেত্রে আপনাকে অবশ্যই উমলাউটে প্রবেশ করতে হবে এবং ফাইলটি সংরক্ষণ করতে হবে)।
এটি বলেছিল, আপনি পালানো স্ট্রিংটিকে স্ট্রিংয়ে পরিণত করতে পাইথন ফাংশন ইওল () ব্যবহার করতে পারেন:
>>> x = eval("'Capit\\xc3\\xa1n\\n'")
>>> x
'Capit\xc3\xa1n\n'
>>> x[5]
'\xc3'
>>> len(x[5])
1
আপনি দেখতে পাচ্ছেন, স্ট্রিং "\ xc3" একক অক্ষরে রূপান্তরিত হয়েছে। এটি এখন একটি 8-বিট স্ট্রিং, ইউটিএফ -8 এনকোডযুক্ত। ইউনিকোড পেতে:
>>> x.decode('utf-8')
u'Capit\xe1n\n'
গ্রেগ লিন্ড জিজ্ঞাসা করেছিলেন: আমি মনে করি এখানে কিছু টুকরো অনুপস্থিত রয়েছে: ফাইল এফ 2 এ রয়েছে: হেক্স:
0000000: 4361 7069 745c 7863 335c 7861 316e Capit\xc3\xa1n
codecs.open('f2','rb', 'utf-8')
উদাহরণস্বরূপ, এগুলি সমস্ত আলাদা আলাদা অক্ষরে পড়ে (প্রত্যাশিত) এএসসিআইআই-তে কোনও ফাইল লেখার কোনও উপায় আছে যা কাজ করবে?
উত্তর: এটি আপনার অর্থের উপর নির্ভর করে। এএসসিআইআই> 127 অক্ষরকে উপস্থাপন করতে পারে না So সুতরাং আপনাকে "পরবর্তী কয়েকটি অক্ষর বলতে কিছু বিশেষ বোঝায়" যা বলার জন্য কিছু উপায় দরকার যা "\ x" ক্রমটি করে। এটি বলে: পরের দুটি অক্ষর হ'ল একক চরিত্রের কোড। ইউনিকোডকে 0xFFFF (65535) পর্যন্ত এনকোড করতে চার অক্ষর ব্যবহার করে "\ u" একই কাজ করে।
সুতরাং আপনি ইউনিকোডকে সরাসরি ASCII এ লিখতে পারবেন না (কারণ ASCII কেবল একই অক্ষর ধারণ করে না)। আপনি এটি স্ট্রিং পলায়ন হিসাবে লিখতে পারেন (f2 হিসাবে); এই ক্ষেত্রে, ফাইলটিকে ASCII হিসাবে উপস্থাপন করা যেতে পারে। অথবা আপনি এটি ইউটিএফ -8 হিসাবে লিখতে পারেন, সেক্ষেত্রে আপনার একটি 8-বিট নিরাপদ প্রবাহ প্রয়োজন।
আপনার সমাধানটি ব্যবহার decode('string-escape')
করে কাজ করে তবে আপনি কতটা স্মৃতি ব্যবহার করবেন তা আপনাকে অবশ্যই সচেতন হতে হবে: ব্যবহারের পরিমাণের তিনগুণ codecs.open()
।
মনে রাখবেন যে একটি ফাইল 8 টি বিট সহ কেবলমাত্র বাইটের ক্রম। বিট বা বাইটগুলির কোনওটিরই অর্থ নেই। আপনারা বলছেন "65 এর অর্থ 'এ'"। যেহেতু \xc3\xa1
"à" হয়ে উঠতে হবে তবে কম্পিউটারটি জানার কোনও উপায় নেই, আপনাকে ফাইলটি লেখার সময় যে এনকোডিংটি ব্যবহার করা হয়েছিল তা নির্দিষ্ট করে জানিয়ে দিতে হবে।