Python - 日本語出力は大変

 クラウディア
1. 概要
2. 日本語を出力する

1. 概要

 正に、「たったこれだけ」という
print('たったこれだけ')


 てなソースを書けば、もちろん

たったこれだけ
 と出力されるのであるが・・・。  これを、例えば、ウェブサーバ上に配置して、ブラウザ越しに実行しようとすると・・・。
Error processing line 1 of /usr/local/lib/python3.6/site-packages/zope.component-4.4.1-py3.4-nspkg.pth:

  Traceback (most recent call last):
    File "/usr/local/lib/python3.6/site.py", line 168, in addpackage
      exec(line)
    File "<string>", line 1, in <module>
    File "<frozen importlib._bootstrap>", line 568, in module_from_spec
  AttributeError: 'NoneType' object has no attribute 'loader'

Remainder of file ignored
Error processing line 1 of /usr/local/lib/python3.6/site-packages/zope.event-4.3.0-py3.5-nspkg.pth:

  Traceback (most recent call last):
    File "/usr/local/lib/python3.6/site.py", line 168, in addpackage
      exec(line)
    File "<string>", line 1, in <module>
    File "<frozen importlib._bootstrap>", line 568, in module_from_spec
  AttributeError: 'NoneType' object has no attribute 'loader'

Remainder of file ignored
Error processing line 1 of /usr/local/lib/python3.6/site-packages/zope.interface-4.5.0-py3.6-nspkg.pth:

  Traceback (most recent call last):
    File "/usr/local/lib/python3.6/site.py", line 168, in addpackage
      exec(line)
    File "<string>", line 1, in <module>
    File "<frozen importlib._bootstrap>", line 568, in module_from_spec
  AttributeError: 'NoneType' object has no attribute 'loader'

Remainder of file ignored
Traceback (most recent call last):
  File "/usr/home/hogehoge/lang/python/stdio/stdout01.py", line 1, in <module>
    print('\u305f\u3063\u305f\u3053\u308c\u3060\u3051')
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-6: ordinal not in range(128)
 てなことになるのである。  これは、上で実行した環境は、標準出力を「UTF-8」に設定しているので、表示できるのですが。  ブラウザ越しだと、デフォルトで標準出力が「ascii」になっているためらしい。  で、対策を探すと、あちこちに用意されている・・・つまり、多くの人が苦労しているわけなのです。  ところが、その多くは、「Python2」系列のものだったりして、真似するとほぼ、エラーになるのです。  現在(2019年12月27日)のわたしの使用している環境は

Python 3.6.9
 で、ありまして、これが変わると以下の記事も変わるかもしれないのですが・・・。  多数ある中で、やっと解決できたのが「sys.stdout のエンコードを変更する in Python3.0 - @kei10in の日記」の記事のおかげです。

2. 日本語を出力する

 参考サイトに基づいて
import io
import sys

sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8')

print('たったこれだけ')


 と、1~5行を加えると
たったこれだけ
 正常に出力されます。  都度都度、エンコーディングを変えるやり方もあるようですが、わたしは、そうそう変えないので、トップに記述するだけでじゅうぶんです。  ちなみにこれは、出力先が、「UTF-8」の場合で書いていますが、文字コードが違う場合はコードの記述を変えれば、応用できるはずです。
 
 
カウンタバックグラウンド