Python 3 では、stdin
とstdout
はエンコーディングを持つ TextIOWrappers であり、したがって通常の文字列 (バイトではありません) を吐き出します。
環境変数PYTHONIOENCODINGで使用されているエンコーディングを変更できます。スクリプト自体でこれを変更する方法もありますか?
Python 3 では、stdin
とstdout
はエンコーディングを持つ TextIOWrappers であり、したがって通常の文字列 (バイトではありません) を吐き出します。
環境変数PYTHONIOENCODINGで使用されているエンコーディングを変更できます。スクリプト自体でこれを変更する方法もありますか?
実際にTextIOWrapper
はバイトを返します。Unicode 文字列を受け取り、特定のエンコーディングでバイト文字列を返します。スクリプトで特定のエンコーディングを使用するように変更sys.stdout
するには、次の例を示します。
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')
倀
(私の端末はUTF-8ではありません)
sys.stdout.buffer
生のバイト ストリームにアクセスします。stdout
以下を使用して、特定のエンコーディングで書き込むこともできます。
sys.stdout.buffer.write('\u5000'.encode('utf8'))
I'm pretty sure this is not possible. It explicitly says in the documentation that "If this is set before running the interpreter, it overrides the encoding used for stdin/stdout/stderr"
also i got an error when trying to change sys.__stdin__.encoding
saying:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: readonly attribute
EDIT: In python 2.x it was possible to change the encoding of stdin/out/err from within the script. In python 3.x it seems like you have to use locale
(or set the environment variable from the command line before running your script).
EDIT: this might be interesting to read for you http://comments.gmane.org/gmane.comp.python.ideas/15313