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

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

ただいまの
回答率

91.26%

  • Python 3.x

    2747questions

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

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 89

Technohead

score 3

現在、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'

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

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

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

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

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

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

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • can110

    2017/12/25 10:40

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

    キャンセル

  • Technohead

    2017/12/25 18:46

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

    キャンセル

  • can110

    2017/12/27 11:51 編集

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

    キャンセル

  • Technohead

    2018/01/03 02:01

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

    キャンセル

回答 2

checkベストアンサー

+2

まず、ちょっと状況が腑に落ちないので、以下に示すコードを

  1. ターミナル上(python temp.py "SafariとEdgeの開発版、Service Workerがデフォルトで利用可能に"のように)
  2. CGI

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

import logging

# 明示的にutf-8でログファイル出力
logger = logging.getLogger('logger')
handler = logging.FileHandler(filename='hoge.log', encoding='utf-8') # ファイル名は自由
handler.setLevel(logging.DEBUG)
logger.addHandler(handler)
logger.setLevel(logging.DEBUG)

import sys
logger.debug( 'version[%s]', sys.version)
logger.debug( 'default[%s]', sys.getdefaultencoding())
logger.debug( 'stdin[%s]', sys.stdin.encoding)
logger.debug( 'stdout[%s]', sys.stdout.encoding)

if len(sys.argv) > 1:
    logger.debug( 'argv[1] type[%s]', type(sys.argv[1]))
    logger.debug( 'argv[1][%s]', sys.argv[1])

for s in ['abc','あいう','㎥']: # ㎥ はUNICODE表現できない出力環境では例外が発生するはず
    logger.debug(s)
    try:
        print(s)
    except UnicodeEncodeError as e:
        logger.error( e)

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

version[3.5.4 |Anaconda custom (64-bit)| (default, Nov  8 2017, 14:34:30) [MSC v.1900 64 bit (AMD64)]]
default[utf-8]
stdin[cp932]
stdout[cp932]
argv[1] type[<class 'str'>]
argv[1][SafariとEdgeの開発版、Service Workerがデフォルトで利用可能に]
abc
あいう
㎥
'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 13:07

    ありがとうございます。
    コードの方は試させてもらいます。

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

    キャンセル

  • 2017/12/26 13:29

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

    キャンセル

  • 2017/12/26 23:15

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

    キャンセル

  • 2017/12/26 23: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
    あいう

    キャンセル

  • 2017/12/27 00:21

    調べってみたのですが、python2系がubuntu環境には入っていないようでした。
    $ python3 -V
    > python 3.5.3

    $ python -V
    The Program 'python' can be found in the following packagesとなって
    インストールを促される

    キャンセル

  • 2017/12/27 11:48

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

    キャンセル

  • 2018/01/03 02:06

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

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

    キャンセル

  • 2018/01/03 02:08

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

    キャンセル

0

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

ただいまの回答率

91.26%

関連した質問

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

  • Python 3.x

    2747questions

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