57704


Webサーバーの、CGIで以下のコードを実行するとエンコーディングのエラーになります。

[code]

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    
    html_body = """
    <!DOCTYOE html>
    <html lang="ja">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title> Test CAM</title>
    </head>
    <body>
    こんにちは<br>
    <form>
    <input type="button" value="Button" onclick="button_click()">
    </form>
    </body>
    </html>
    """
    print("Content-type: text/html\n")
    print(html_body)
    
[/code]

エラー内容は

[code]

    UnicodeEncodeError: 'ascii' codec can't encode characters in position 153-157:
    
[/code]

ただし、ファイルは

[code]

    $ nkf -guess test.py
    UTF-8
    
[/code]

なので、utf-8のはずです

どうも、リダイレクトの折にエラーになるようで

[code]

    import sys
    sys.setdefaultencoding('utf-8')
    
[/code]

を入れて見ましたが、今度は

[code]

    AttributeError: module 'sys' has no attribute 'setdefaultencoding'
    
[/code]

とのエラーになります。

Python3ではどのように対処すれば良いでしょうか？


CC BY-SA 4.0
2019-08-30T00:07:16.503
57703
2019-08-30T01:47:42.083
2019-08-30T01:47:42.083
29826
15090
question
python python3 cgi
CGIとして動作させた場合のUnicodeEncodeError


Windows10のpython3.6ですが、`python -m http.server
--cgi`を[実行](https://qiita.com/goodboy_max/items/833d482827bf0efab45a)した場合は文字化けしました。

文字列がShift-
JISで送られていましたので、[リンク先](https://imarismile.com/2018/08/09/post-7910/)のように[`io.TextIOWrapper`](https://docs.python.org/ja/3/library/io.html#io.TextIOWrapper)を冒頭に記述することで対処出来ました。

OSが違うので直接の回答になるかは分かりませんが、ご参考になれば。

変更前:

[code]

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    
[/code]

変更後:

[code]

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


CC BY-SA 4.0
2019-08-30T01:25:54.517
57704
2019-08-30T01:25:54.517
9820
57703
answer