37929


pythonで単純に日本語をprintしようとしたら、エラーになってしまいます。

[code]

    # -*- coding: utf-8 -*-
    try:
        print("あああ")
    except Exception as e:
        print(e)
    
[/code]

実行結果

[code]

    'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)
    
[/code]

pythonのバージョン

[code]

    # python -V
    Python 3.6.0 :: Anaconda 4.3.1 (64-bit)
    
[/code]

下記の３行を追加すればエラーは治りますが、普通この３行は不要だと思います。  
この３行を記述する事なく日本語をprintしたいのですが、どうすれば良いでしょうか？

[code]

    import sys
    import io
    sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
    
[/code]

[追記]  
ちなみにsys.stdout.encodingのデフォルト値は「ANSI_X3.4-1968」でした。

[code]

    # python
    Python 3.6.0 |Anaconda 4.3.1 (64-bit)| (default, Dec 23 2016, 12:22:00)
    [GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import sys
    >>> print(sys.stdout.encoding)
    ANSI_X3.4-1968
    
[/code]

[追記２]  
LANGは指定無し、LC_CTYPEはPOSIXでした。

[code]

    # locale
    LANG=
    LC_CTYPE="POSIX"
    LC_NUMERIC="POSIX"
    LC_TIME="POSIX"
    LC_COLLATE="POSIX"
    LC_MONETARY="POSIX"
    LC_MESSAGES="POSIX"
    LC_PAPER="POSIX"
    LC_NAME="POSIX"
    LC_ADDRESS="POSIX"
    LC_TELEPHONE="POSIX"
    LC_MEASUREMENT="POSIX"
    LC_IDENTIFICATION="POSIX"
    LC_ALL=
    
[/code]

[追加３]  
localeを変更してもエラーメッセージが出てきて、うまくいきませんでした。

[code]

    # export LANG=ja_JP.UTF-8
    # locale
    locale: Cannot set LC_CTYPE to default locale: No such file or directory
    locale: Cannot set LC_MESSAGES to default locale: No such file or directory
    locale: Cannot set LC_ALL to default locale: No such file or directory
    LANG=ja_JP.UTF-8
    LC_CTYPE="ja_JP.UTF-8"
    LC_NUMERIC="ja_JP.UTF-8"
    LC_TIME="ja_JP.UTF-8"
    LC_COLLATE="ja_JP.UTF-8"
    LC_MONETARY="ja_JP.UTF-8"
    LC_MESSAGES="ja_JP.UTF-8"
    LC_PAPER="ja_JP.UTF-8"
    LC_NAME="ja_JP.UTF-8"
    LC_ADDRESS="ja_JP.UTF-8"
    LC_TELEPHONE="ja_JP.UTF-8"
    LC_MEASUREMENT="ja_JP.UTF-8"
    LC_IDENTIFICATION="ja_JP.UTF-8"
    LC_ALL=
    
    # LANG=ja_JP.UTF-8 python -c 'import sys; print(sys.stdout.encoding)'
    ANSI_X3.4-1968
    # LANG=en_US python -c 'import sys; print(sys.stdout.encoding)'
    ISO-8859-1
    
    # python
    Python 3.6.0 |Anaconda 4.3.1 (64-bit)| (default, Dec 23 2016, 12:22:00)
    [GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import sys
    >>> print(sys.stdout.encoding)
    ANSI_X3.4-1968
    >>> print("aaa")
    aaa
    >>> print("���������")
      File "<stdin>", line 0
    
        ^
    SyntaxError: 'ascii' codec can't decode byte 0xe3 in position 7: ordinal not in range(128)
    >>> print("あああ")
      File "<stdin>", line 0
    
        ^
    SyntaxError: 'ascii' codec can't decode byte 0xe3 in position 7: ordinal not in range(128)
    >>>
    
[/code]


CC BY-SA 3.0
2017-09-13T04:08:49.683
37913
2017-09-15T03:06:23.973
2017-09-15T03:06:23.973
7277
7277
question
python
pythonのprintで日本語の出力がデフォルトで出来ない。


これと同件っぽいですね。 <https://stackoverflow.com/questions/37246756/django-uses-
ansi-x3-4-1968-encoding-instead-of-utf-8>

環境変数 `PYTHONIOENCODING` に `utf-8` を設定して回避する方法が紹介されています。

さらに <https://stackoverflow.com/questions/2596714/why-does-python-print-
unicode-characters-when-the-default-encoding-is-ascii/21968640#21968640>
を読むと、環境変数 `LC_CTYPE` （あるいはLANGあたり）が根本原因なのではないかと思われます。

実行しているOSのターミナルで環境変数がどうなっているか確認してみてください。


CC BY-SA 3.0
2017-09-13T05:43:43.460
37916
2017-09-13T05:43:43.460
806
37913
answer


pythonは標準出力のエンコーディングがシステムのロケールによって変化するようです。

[code]

    % LANG=en_US python -c 'import sys; print(sys.stdout.encoding)'
    US-ASCII
    % LANG=ja_JP.UTF-8 python -c 'import sys; print(sys.stdout.encoding)'
    UTF-8
    
[/code]

これが、UTF-8になっていないと質問の通りエラーとなります。

ロケールの設定(環境変数`LANG`や`LC-*`)が`ja_JP.UTF-8`などUTF-8が使われる状態になってるか確認してください。

また、ANSI_X3.4-1968で検索してみたところ、システムのロケールが壊れていたときにこのような症状が出たとの報告が見つかりました。

<https://ota42y.com/blog/2015/06/03/linux_local/>

設定の問題でなければ、ロケール情報の再構築やアップデートで治るかもしれません。


CC BY-SA 3.0
2017-09-13T07:28:58.563
37921
2017-09-13T07:28:58.563
5793
37913
answer


Windows の場合はコンソールのコードページを、それ以外の場合はロケールを日本語向けに設定してください。環境変数 `PYTHONIOENCODING`
でも設定できますが、コンソールのエンコードと食い違う可能性があります。

`sys.stdout`
というストリームはプラットフォームごとに用意されている特別なテキストファイルのようなものであり、従って互換性のためエンコーディングもプラットフォーム依存にしているのでしょう
(残念ながら、デフォルトでは UTF-8
で解釈しないコンソールもあるのです)。[ドキュメント](https://docs.python.org/ja/3.6/library/sys.html#sys.stdout)にも以下のように書かれています。

> これらのストリームは
> [`open()`](https://docs.python.org/ja/3.6/library/functions.html#open)
> が返すような通常の [テキストファイル](https://docs.python.org/ja/3.6/glossary.html#term-text-
> file) です。引数は以下のように選択されます:
>
>   * 文字エンコーディングはプラットフォーム依存です。Windows では、ストリームが対話型 (`isatty()` メソッドが `True`
> を返す場合) であれば、コンソールのコードページが、それ以外では ANSI
> コードページが使用されます。その他のプラットフォームでは、ロケールのエンコーディングが使用されます
> ([`locale.getpreferredencoding()`](https://docs.python.org/ja/3.6/library/locale.html#locale.getpreferredencoding)
> を参照)。
>
> しかしながら、どのプラットフォームでも Python を起動する前に環境変数
> [`PYTHONIOENCODING`](https://docs.python.org/ja/3.6/using/cmdline.html#envvar-
> PYTHONIOENCODING) を設定することでこの値を上書きすることが出来ます。
>
>

ロケールによってもエンコーディングが変わるのは不思議かもしれませんが、ロケールにはコードセットも指定できるため (例:
`en_US.UTF-8`)、しょうがないです。自分が使いたい適切なロケールを設定しましょう。


CC BY-SA 3.0
2017-09-13T13:20:51.337
37929
2017-09-13T13:20:51.337
19110
37913
answer