解放区在住氷翠 緑の閃光
【解放区在住氷翠】氷翠のお気楽日記

PHPとpythonの連携

2023-12-29

どうも、氷翠です。

仕事の中でどうしても文字のエンコードについて、変換する必要がある。いずれ必要はなくなるだろうけど、今はどうしても必要なことだった。

データを別の部門からもらうとき、テキストファイルのエンコードは「Shift-JIS」になっているので、これを「UTF-8」に変換する作業が発生する今現在はテキストエディタで一つずつ変換しているのだが、これが大量にあると、いちいち面倒。

なので、氷翠は変換するときに、pythonを使って変換する方法を思いついた。実行はターミナルでコマンドラインで行うが、一気に処理できるので問題はない。なんとか、簡単だけど、pythonでエンコードを変換することができたので非常によかった。

もちろん、PHPでも変換はできますが、たまに文字化けを起こすことがある。最近ではその傾向も減ってきてはいるのだが、その辺はpythonの方が優秀と言わざるを得ない。なので、pythonを使ったということです。

で、本題はここから。

その後、Macの自動処理の時に使う「automator」を使って、ダブルクリックでpythonを起動する方法を使って一気に変換するという方法をとることにしたのだ。これもうまくいって、現在はこれを利用している。

そして、新しいCodeigniter4を使っての開発の中で、PHPからpythonを起動したほうが手っ取り早く変換ができるだろうと考え、pythonのプログラムも見直し。

その結果

import sys
import codecs

arg = sys.argv
path = arg[1]

try:
    # SJISからUTF-8に変換
    with codecs.open(path, 'r', 'shift_jis') as f_in:
        content = f_in.read()

    with codecs.open(path, 'w', 'utf-8') as f_out:
        f_out.write(content)

    #print(f'変換が完了しました: {path}')

except Exception as e:
    print(f'変換中にエラーが発生しました: {str(e)}')

ここまですっきりしたコードになりました。

まぁ、簡単に説明すると、すっきりさせるためにChatGPTで作ってもらったんだけどね。pythonに関しては氷翠は初心者状態なので、AIに作ってもらった方が綺麗に作ってくれる。

あとはPHPの中でコマンドを打ち込む動作をさせればいいわけだから、system関数を利用することにする。

返り値 = system(コマンド, 出力された内容);

こんな感じで使うことができる。今回は返り値を使うことはなかったのだけど、念のため変数にいれておくことにした。もちろん出力された内容に関しても同じようなものだ。

問題はコマンドの方で、コマンドラインでpythonを起動しなくてはいけない。

python 実行するpythonファイル 変換するファイル名

という感じで一つのファイルを変換する感じだ。しかし、大量にあるのでそこはPHPで繰り返し処理を行えば簡単に出来る。

もっとpythonと連携することができれば、いろいろとできそうな気がする。

コメントを残す

メールアドレスが公開されることはありません。