पहला: reload(sys)आउटपुट टर्मिनल स्ट्रीम की आवश्यकता के संबंध में कुछ यादृच्छिक डिफ़ॉल्ट एन्कोडिंग सेट करना बुरा व्यवहार है। reloadअक्सर sys में चीजें बदलती हैं जो पर्यावरण के आधार पर रखी गई हैं - जैसे sys.stdin / stdout स्ट्रीम, sys.excepthook, आदि।
Stout पर सांकेतिक शब्दों में बदलना समस्या का समाधान
Sys.stdout पर print'यूनिकोड स्ट्रिंग्स और परे- strएससीआई (जैसे शाब्दिक से) के एन्कोडिंग समस्या को हल करने के लिए मुझे पता है कि सबसे अच्छा समाधान है: एक sys.stdout (फ़ाइल जैसी वस्तु) का ध्यान रखना जो सक्षम है और वैकल्पिक रूप से जरूरतों के बारे में सहिष्णु:
जब sys.stdout.encodingहै Noneकिसी कारण से, या गैर मौजूदा, या ग़लती से झूठी या "कम" क्या stdout टर्मिनल या वास्तव में धारा में सक्षम है की तुलना में है, तो एक सही प्रदान करने की कोशिश .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 कोड में परे-एससीआई सादे स्ट्रिंग शाब्दिक का उपयोग करना
वैश्विक डिफ़ॉल्ट एन्कोडिंग (केवल UTF-8 में बदलने का एकमात्र कारण) मुझे लगता है कि एक एप्लिकेशन स्रोत कोड निर्णय के बारे में है - और I / O स्ट्रीम एन्कोडिंग मुद्दों के कारण नहीं: कोड से परे-एएससीआई स्ट्रिंग शाब्दिक को मजबूर किए बिना लिखने के लिए। हमेशा u'string'स्टाइल यूनिकोड से बचने के लिए। यह लगातार किया जा सकता है ( पायोन 2 या पायथन 2 + 3 स्रोत कोड के आधार पर जो असिसी या यूटीएफ -8 सादे स्ट्रिंग शाब्दिक का लगातार उपयोग करता है - जहां तक ये तार संभावित रूप से चुप रहते हैं यूनिकोड रूपांतरण और मॉड्यूल के बीच चलते हैं या संभावित रूप से stdout में जाते हैं। उसके लिए, पसंद करें "# encoding: utf-8"या ascii (कोई घोषणा नहीं)। परिवर्तन या ड्रॉप लाइब्रेरी जो अभी भी chr # 127 (जो कि आज दुर्लभ है) से परे ascii डिफ़ॉल्ट एन्कोडिंग त्रुटियों पर बहुत विनम्रतापूर्वक निर्भर करती है।
और आवेदन शुरू होने पर (और / या sitecustomize.py के माध्यम से) 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 होगा। फ़ाइल I / O को निश्चित रूप से एन्कोडिंग के संबंध में विशेष देखभाल की आवश्यकता है - जैसा कि पायथन 3 में है।
नोट: मैदानी स्ट्रिंग्स SmartStdoutको आउटपुट स्ट्रीम एन्कोडिंग में परिवर्तित होने से पहले यूनिकोड से यूनिकोड में परिवर्तित किया जाता है।