In fact, TextIOWrapper returns bytes. It takes a Unicode string and returns a byte string in a specific encoding. To change sys.stdout to use a specific encoding in a script, here is an example:
Python 3.2.3 (default, Apr 11 2012, 07:15:24) [MSC v.1500 32 bit (Intel)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> print('\u5000') Traceback (most recent call last): File "<stdin>", line 1, in <module> File "C:\dev\python32\lib\encodings\cp437.py", line 19, in encode return codecs.charmap_encode(input,self.errors,encoding_map)[0] UnicodeEncodeError: 'charmap' codec can't encode character '\u5000' in position 0: character maps to <undefined>>>> import io >>> import io >>> import sys >>> sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf8') >>> print('\u5000') 倀
(my terminal is not UTF-8)
sys.stdout.buffer refers to the original byte stream. You can also use the following to write to stdout in a specific encoding:
sys.stdout.buffer.write('\u5000'.encode('utf8'))
source share