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

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

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

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

Q&A

解決済

2回答

1757閲覧

PythonでPHPから受け取った日本語文字列の処理でエラーが出る

Technohead

総合スコア14

Python 3.x

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

0グッド

1クリップ

投稿2017/12/24 14:11

編集2017/12/25 09:45

現在、PHPからPythonに渡した日本語の引数が引き起こす(と考えられる)エラーで悩んでいます。
さきほど別の質問で、loggingの仕方を教えてもらい、変数の中身を見ることができました。

1)phpから、Python3ファイルを起動。起動時に、引数で、日本語・英語交じりのテキストを渡している
2)Python側で、引数を受け取って、それを処理しようとすると、下記エラーが出る
なお、引数が半角アルファベットだとエラーは発生しない

 ・渡している引数:
"SafariとEdgeの開発版、Service Workerがデフォルトで利用可能に"
type関数で見ると、class str型になる

localeの情報は
utf-8
ANSI_3.4-1968 (←過去ログにこれがあやしいような投稿があったのですが理解できませんでした)

 ・そのまま処理したいのだけど、下記の文字列になってしまっている(logginで出力)
'Safari\udce3\udc81\udca8Edge\udce3\udc81\udcae\udce9\udc96\udc8b\udce7\udc99\udcba\udce7\udc89\udc88\udce3\udc80\udc81Service Worker\udce3\udc81\udc8c\udce3\udc83\udc87\udce3\udc83\udc95\udce3\udc82\udca9\udce3\udc83\udcab\udce3\udc83\udc88\udce3\udc81\udca7\udce5\udc88\udca9\udce7\udc94\udca8\udce5\udc8f\udcaf\udce8\udc83\udcbd\udce3\udc81\udcab'

 ・そのまま処理を続けようとすると下記が出ます:
'ascii' codec can't encode characters

環境:
ubuntu16 LTS
Python3

私の理解では、UTF-8で受け取っているのだけど、何らかの理由でpythonがASCIIでエンコードしようとしている。

2週間ほど、encode、decodeなど試してみたのですが、解決できませんでした。
どうすれば、解決できますでしょうか。

よろしくお願いします。

追記:
ミニマムな処理コードは、下記の通りです。

<PHPファイル>
$myStr_PHP_to_Python ='/usr/bin/python3 /var/www/html/readDoneUndone.py ' . '"SafariとEdgeの開発版、Service Workerがデフォルトで利用可能に"'
exec($myStr_PHP_to_Python);

<Pythonファイル>・・・readDoneUndone.py
import sys
import sys, codecs #may not necessary
myArgv = sys.argv[1]
#このmyArgvをlogginで書き出すと、下記の文字列になってしまいます。
'Safari\udce3\udc81\udca8Edge\udce3\udc81\udcae\udce9\udc96\udc8b\udce7\udc99\udcba\udce7\udc89\udc88\udce3\udc80\udc81Service Worker\udce3\udc81\udc8c\udce3\udc83\udc87\udce3\udc83\udc95\udce3\udc82\udca9\udce3\udc83\udcab\udce3\udc83\udc88\udce3\udc81\udca7\udce5\udc88\udca9\udce7\udc94\udca8\udce5\udc8f\udcaf\udce8\udc83\udcbd\udce3\udc81\udcab'

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

can110

2017/12/25 01:40

現象が再現する最小限のコードおよびエラー詳細(Tracebackすべて)を提示すると回答得られやすいです。
Technohead

2017/12/25 09:46

コメントありがとうございます。コードを追記しました。
can110

2017/12/27 02:51 編集

実際にエラーが発生する(ファイル書き出し?)部分のコードとエラー詳細(Tracebackすべて)を提示ください。
Technohead

2018/01/02 17:01

遅くなりまして申し訳ありません。なんとか自分でできそうだったので頑張ってみました。
guest

回答2

0

ベストアンサー

まず、ちょっと状況が腑に落ちないので、以下に示すコードを
0. ターミナル上(python temp.py "SafariとEdgeの開発版、Service Workerがデフォルトで利用可能に"のように)
0. CGI

で実行してみてください。
下記コードでは、ログ出力時のエンコーディングとしてUTF-8を指定しているので、日本語も文字化けせずに出力できるはずです。

Python

1import logging 2 3# 明示的にutf-8でログファイル出力 4logger = logging.getLogger('logger') 5handler = logging.FileHandler(filename='hoge.log', encoding='utf-8') # ファイル名は自由 6handler.setLevel(logging.DEBUG) 7logger.addHandler(handler) 8logger.setLevel(logging.DEBUG) 9 10import sys 11logger.debug( 'version[%s]', sys.version) 12logger.debug( 'default[%s]', sys.getdefaultencoding()) 13logger.debug( 'stdin[%s]', sys.stdin.encoding) 14logger.debug( 'stdout[%s]', sys.stdout.encoding) 15 16if len(sys.argv) > 1: 17 logger.debug( 'argv[1] type[%s]', type(sys.argv[1])) 18 logger.debug( 'argv[1][%s]', sys.argv[1]) 19 20for s in ['abc','あいう','㎥']: # ㎥ はUNICODE表現できない出力環境では例外が発生するはず 21 logger.debug(s) 22 try: 23 print(s) 24 except UnicodeEncodeError as e: 25 logger.error( e)

なお、以下は当方環境(Win10+コマンドプロンプト上)で実行した結果です。
hoge.log結果

Plain

1version[3.5.4 |Anaconda custom (64-bit)| (default, Nov 8 2017, 14:34:30) [MSC v.1900 64 bit (AMD64)]] 2default[utf-8] 3stdin[cp932] 4stdout[cp932] 5argv[1] type[<class 'str'>] 6argv[1][SafariとEdgeの開発版、Service Workerがデフォルトで利用可能に] 7abc 8あいう 910'cp932' codec can't encode character '\u33a5' in position 0: illegal multibyte sequence

次に'ascii' codec can't encode charactersエラーについてですが、おそらくprintにて発生しているものとして回答します。
日本語を含むユニコード文字列が、標準出力先(ascii)エンコーディングにエンコードできないためエラーが発生していると思われます。
標準出力先のエンコーディング指定方法は、OS側の設定となるので、具体的にはubuntu側の設定を適切に設定する必要があります。

投稿2017/12/26 02:03

can110

総合スコア38266

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Technohead

2017/12/26 04:07

ありがとうございます。 コードの方は試させてもらいます。 取り急ぎお伝えしたい点としては、 ウェブアプリを想定していて、print文ではなくて、loggingとファイル書き出しで生じています。ご指摘の通り、print文でも同じことが発生するとは思います。
can110

2017/12/26 04:29

ファイル書き出し処理も含むコードとエラー全文(Traceback)も提示されるともう少し原因に近づけるかもしれません。 とりあえず現状ではloggingの出力結果にて ・前後に「'」がついている ・「\u~」形式でUNICODE文字列が表現されている ことから、どうもpython2.x(3.xではなく)上で動作しているように見えるのが気になります。
Technohead

2017/12/26 14:15

ありがとうございます。 出てくるエラーを検索すると、2.x系で動いている時に出ている記述が多いのは確かでした。
Technohead

2017/12/26 14:15

教えていただいたコードを実行してみました。 version[3.5.2 (default, Nov 23 2017, 16:37:01) [GCC 5.4.0 20160609]] default[utf-8] stdin[UTF-8] stdout[UTF-8] argv[1] type[<class 'str'>] argv[1][SafariとEdgeの開発版、Service Workerがデフォルトで利用可能に] abc あいう ㎥
Technohead

2017/12/26 15:21

調べってみたのですが、python2系がubuntu環境には入っていないようでした。 $ python3 -V > python 3.5.3 $ python -V The Program 'python' can be found in the following packagesとなって インストールを促される
can110

2017/12/27 02:48

コメントありがとうございます。loggingは治り、print結果はもともと正常のようですね。 あとは実際にエラーが出るファイル書き出し処理のコードによるかと。
Technohead

2018/01/02 17:06

長らく、myHTML_strという書き込みたい文字列に対して、 encode処理を試みたり、ファイルの書き込み時にencode指定ができないかとトライしていましたが、、 下記で解決しました。 ファイルを開くときに、指定するのですね、、、。 「出力時」にエンコードするものだと思っておりました。 f = open(Path, 'w', encoding='utf-8') f.write(myHTML_str)
Technohead

2018/01/02 17:08

いただいたコードの handler = logging.FileHandler(filename='hoge.log', encoding='utf-8') の部分で、ハッと気づきました。 ありがとうございました。
guest

0

長らく、myHTML_strという書き込みたい文字列に対して、
encode処理を試みたり、ファイルの書き込み時にencode指定ができないかとトライしていましたが、、
下記で解決しました。
ファイルを開くときに、指定するのですね、、、。
「出力時」にエンコードするものだと思っておりました。

f = open(Path, 'w', encoding='utf-8')
f.write(myHTML_str)

投稿2018/01/02 17:06

Technohead

総合スコア14

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問