প্রথম: reload(sys)
এবং আউটপুট টার্মিনাল স্ট্রিমের প্রয়োজনীয়তার জন্য কিছু র্যান্ডম ডিফল্ট এনকোডিং সেট করা অনুশীলন। reload
পরিবেশের উপর নির্ভর করে স্থাপন করা জিনিসগুলি প্রায়শই সিস্টেমে পরিবর্তন করা হয় - যেমন sys.stdin / stdout প্রবাহ, sys.excepthook ইত্যাদি etc.
স্টডআউটে এনকোড সমস্যা সমাধান করা
Sys.stdout- এ ' print
ইউনিকোড স্ট্রিংগুলি এবং এর বাইরে- str
অ্যাসকি'র (যেমন আক্ষরিক থেকে) এর এনকোড সমস্যা সমাধানের জন্য আমি যে সেরা সমাধানটি জানি তা হ'ল একটি সিএস.স্টডআউট (ফাইল-এর মতো অবজেক্ট) এর যত্ন নেওয়া যা সক্ষম এবং প্রয়োজনীয়তা সম্পর্কে বিকল্পভাবে সহনশীল:
কখন sys.stdout.encoding
None
স্টাডাউট টার্মিনাল বা স্ট্রিম আসলেই সক্ষম তার থেকে কোনও কারণে, বা অ-বিদ্যমান, বা ভুলভাবে ভুল বা "কম" হয়ে থাকে, তখন একটি সঠিক .encoding
বৈশিষ্ট্য সরবরাহ করার চেষ্টা করুন । শেষ পর্যন্ত sys.stdout & sys.stderr
কোনও অনুবাদ ফাইলের মতো বস্তুর পরিবর্তে।
যখন টার্মিনাল / স্ট্রিমটি এখনও উপস্থিত সমস্ত ইউনিকোড অক্ষরকে এনকোড করতে পারে না এবং যখন আপনি কেবল এটির print
কারণে ভেঙে যেতে চান না তখন আপনি অনুবাদ ফাইল-এর মতো অবজেক্টে একটি এনকোড-সহ-প্রতিস্থাপনের আচরণটি প্রবর্তন করতে পারেন।
এখানে একটি উদাহরণ:
#!/usr/bin/env python
# encoding: utf-8
import sys
class SmartStdout:
def __init__(self, encoding=None, org_stdout=None):
if org_stdout is None:
org_stdout = getattr(sys.stdout, 'org_stdout', sys.stdout)
self.org_stdout = org_stdout
self.encoding = encoding or \
getattr(org_stdout, 'encoding', None) or 'utf-8'
def write(self, s):
self.org_stdout.write(s.encode(self.encoding, 'backslashreplace'))
def __getattr__(self, name):
return getattr(self.org_stdout, name)
if __name__ == '__main__':
if sys.stdout.isatty():
sys.stdout = sys.stderr = SmartStdout()
us = u'aouäöüфżß²'
print us
sys.stdout.flush()
পাইথন 2/2 + 3 কোডে অ্যাসসিআই প্লেইন স্ট্রিং লিটারেলগুলি ব্যবহার করে
গ্লোবাল ডিফল্ট এনকোডিংটি পরিবর্তন করার একমাত্র ভাল কারণ (কেবলমাত্র ইউটিএফ -8- এ) আমি মনে করি একটি অ্যাপ্লিকেশন উত্স কোড সিদ্ধান্ত সম্পর্কিত - এবং I / O স্ট্রিম এনকোডিংয়ের কারণে নয়: বাধ্য হয়েই কোডে অ্যাস্কি স্ট্রিং আক্ষরিক লেখার জন্য সর্বদা "বা এসসিআই (কোনও ঘোষণা নেই) ব্যবহার করুন libra ক্রিয়াকলাপ # 127 (যা আজকাল বিরল) এর বাইরে অ্যাস্কি ডিফল্ট এনকোডিং ত্রুটির উপর এখনও মূর্খভাবে নির্ভর করে এমন লাইব্রেরিগুলি পরিবর্তন করুন বা ছেড়ে দিন।u'string'
শৈলী ইউনিকোড পলায়ন । এটি বরং ধারাবাহিকভাবে করা যেতে পারে ( অ্যানডাবজারের নিবন্ধটি যা বলে তা সত্ত্বেও ) পাইথন 2 বা পাইথন 2 + 3 উত্স কোড ভিত্তিতে যত্ন সহকারে যা এএসসিআই বা ইউটিএফ -8 প্লেইন স্ট্রিং আক্ষরিক ধারাবাহিকভাবে ব্যবহার করে - যতক্ষণ না এই স্ট্রিংগুলি সম্ভবত নীরবতার মধ্যে থেকে যায় ইউনিকোড রূপান্তর এবং মডিউলগুলির মধ্যে সরানো বা সম্ভাব্যভাবে স্টডআউটে যান। তার জন্য, "# encoding: utf-8
এবং SmartStdout
উপরের স্কিম ছাড়াও অ্যাপ্লিকেশন শুরুতে (এবং / অথবা সিটিকাস্টমাইজ.পি মাধ্যমে) এর মতো করুন - ব্যবহার না করে reload(sys)
:
...
def set_defaultencoding_globally(encoding='utf-8'):
assert sys.getdefaultencoding() in ('ascii', 'mbcs', encoding)
import imp
_sys_org = imp.load_dynamic('_sys_org', 'sys')
_sys_org.setdefaultencoding(encoding)
if __name__ == '__main__':
sys.stdout = sys.stderr = SmartStdout()
set_defaultencoding_globally('utf-8')
s = 'aouäöüфżß²'
print s
এইভাবে স্ট্রিং আক্ষরিক এবং বেশিরভাগ ক্রিয়াকলাপ (অক্ষর পুনরাবৃত্তি বাদে) ইউনিকোড রূপান্তর সম্পর্কে চিন্তা না করেই স্বাচ্ছন্দ্যপূর্ণ কাজ করে যেন সেখানে কেবল পাইথন 3 থাকবে। ফাইল আই / ও অবশ্যই এনকোডিংগুলি সম্পর্কে সর্বদা বিশেষ যত্নের প্রয়োজন - এটি পাইথন 3-তে রয়েছে।
দ্রষ্টব্য: সমভূমি স্ট্রিংগুলি পরে SmartStdout
আউটপুট স্ট্রিম এনকোন্ডিংয়ে রূপান্তরিত হওয়ার পূর্বে অনিচ্ছাকৃতভাবে utf-8 থেকে ইউনিকোডে রূপান্তরিত হয়।