質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Unicode

Unicodeはエンコーディングの標準規格です。1つの文字コード体系で多国語の表現を可能にすることを目指して作られています。

UTF-8

UTF-8は8ビット符号単位の文字符号化形式及び文字符号化スキームです。データ交換方式、ファイル形式としては、一般的にUTF-8が使われる傾向があります。

解決済

Python3のUnicodeEncodeErrorについて

teityura
teityura

総合スコア80

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Unicode

Unicodeはエンコーディングの標準規格です。1つの文字コード体系で多国語の表現を可能にすることを目指して作られています。

UTF-8

UTF-8は8ビット符号単位の文字符号化形式及び文字符号化スキームです。データ交換方式、ファイル形式としては、一般的にUTF-8が使われる傾向があります。

1回答

0評価

0クリップ

1743閲覧

投稿2018/11/11 09:29

編集2018/11/11 11:00

下記を実行し、英数字をinputすれば問題なく動作するのですが、
日本語文字列を入れると、
UnicodeEncodeError: 'utf-8' codec can't encode characters in position [txt変数に格納された文字列の該当位置開始位置から終了位置]: surrogates not allowed

type(txt): <class 'str'>
type(answer): <class 'str'>
typeを見ても、同じstr型のクラスで問題なさそうに思えます。
どう解釈されて、なぜエラーになっているのでしょうか。

bash

# エラー内容 ↓↓↓↓↓ キリンは大昔から__複数名詞__の興味の対象でした、キリンは__複数名詞__の中で一番背が買いですが、科学者たちはそのような長い__体の一部__をどうやって獲得したのか説明できません。キリンの身長は___数値__ __単位__ 近くあり、その高さのほとんどは足と__体の一部__によるものです。 type(txt): <class 'str'> type(mls): <class 'str'> __複数名詞__を入力: あういえお type(answer): <class 'str'> __複数名詞__を入力: a type(answer): <class 'str'> __体の一部__を入力: i type(answer): <class 'str'> ___数値__を入力: u type(answer): <class 'str'> __単位__を入力: e type(answer): <class 'str'> __体の一部__を入力: o type(answer): <class 'str'> Traceback (most recent call last): File "17-p213.py", line 29, in <module> mad_libs(txt) File "17-p213.py", line 23, in mad_libs print(mls) UnicodeEncodeError: 'utf-8' codec can't encode characters in position 8-22: surrogates not allowed

python3

#!/usr/bin/env python3.6 # encoding: utf-8 import re import io, sys sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8") txt = """キリンは大昔から__複数名詞__の興味の対象でした、キリンは__複数名詞__の中で一番背が買いですが、科学者たちはそのような長い__体の一部__をどうやって獲得したのか説明できません。キリンの身長は___数値__ __単位__ 近くあり、その高さのほ>とんどは足と__体の一部__によるものです。 """ def mad_libs(mls): hints = re.findall("__.*?__", mls) print("type(mls): ", type(mls)) if hints is not None: for hint in hints: question = "{}を入力: ".format(hint) answer = input(question) print("type(answer): ", type(answer)) # 1つだけ置換 mls = mls.replace(hint, answer, 1) print("\n") mls = mls.replace("\n", "") print(mls) else: print("引数: mls が無効です") print(txt) print("type(txt): ", type(txt)) mad_libs(txt)

※追記:
export LC_ALL=en_US.UTF-8
をしたら日本語をinput()に渡したら動作するようになりましたが、
exportしなくてもいいように、
import io, sys
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8")
を追加したのですが、なぜこのような違いが出るのでしょうか。

bash

echo $SHELL /usr/bin/fish fish --version fish, version 2.7.1 echo $locale echo $LC_ALL export LC_ALL=en_US.UTF-8 echo $locale echo $LC_ALL en_US.UTF-8

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

can110

2018/11/11 10:05 編集

Windows環境にて再現しません。単純な"あいう"などを入力しても surrogates not allowedになりますか?あるいは別のエラーにならないでしょうか?可能であればエラーのTraceback全文を提示ください。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Unicode

Unicodeはエンコーディングの標準規格です。1つの文字コード体系で多国語の表現を可能にすることを目指して作られています。

UTF-8

UTF-8は8ビット符号単位の文字符号化形式及び文字符号化スキームです。データ交換方式、ファイル形式としては、一般的にUTF-8が使われる傾向があります。