UnicodeDecodeError: ‘cp932’ codec can’t decode byte 0xef in position 対処方法まとめ

多くの巷のストラテジーのバックテストを行い、有効性の検証をし続けている。

ライブラリや検証結果の詳細表示等も継続的に拡張し、バックテスト実施環境の快適化を進めている。

が、自動売買部分の開発が全く進んでない。

  • 【完】SBI証券へアクセス
  • 【完】購入候補銘柄の現在の株価チェック
  • 【完】購入希望額に達しているかのチェック → 今はここでメール送信
  • 【未】購入可能数のチェック
  • 【未】信用買い
  • 【未】売りの指値セット
  • 【未】指値キャンセル
  • 【未】(当日中の)信用売り

自動発注処理の実装は、とたんに楽しくなくなる。何故だろう。

購入銘柄候補のメールが毎日届くはずなのに、時々メールが届かない。

これで2回目だなぁ……理由をさぐるか。

PythonでProxyサーバ経由で購入銘柄情報をメール送信する(システムトレード)
今までのあらすじ。誰かが言った。人生の悲劇は2つしかない。ひとつは、金のない悲劇もうひとつは、金のある悲劇「ユダヤ人大富豪の教え」の著書・本田健氏は言った。お金持ちになるには5つの...
PythonからYahooのSMTP(SSL)接続+ Proxy経由をメール送信する方法(SMTP_SSL、setdefaultproxy)
折角実装したのに、Yahooにメールが届かなくなった。パソコン側の問題?アップデートでも走った?うーん、どこまで通信ができているのだろう?どうやらYahooのSTMPサーバから応答がないら...

エラー内容を確認する

出ているエラーを見てみると次のように出力されていた。

どうやら、デフォルトの場合、文字のコーディングはUTF-8になるが、Windows環境を使用しているとデフォルトがcp932(Shift-JIS)でコーディングされる。

なので、プログラムにUTF-8でコーディングする様に記述を加える。

もしくは次のようにする(UTF-8でBOMが付く場合)。

ここまでは、どのサイトを見ても書いてある。

悪さをしているコードを消す

何かの理由で文字コードが入ってしまっている場合もある。

そもそもUnicodeEncodeErrorの原因は、CP932へ変換できないコードが含まれているのが原因なので、その悪さをしているコードを消してしまえば解決する。

ただ、CP932へ変換出来ないコードを網羅的に対応するのは面倒だし漏れやすい。

その場合は、encode関数に変換出来ない場合は無視するオプションを利用するのがよい。

この情報も多くないが見つかる。

上記で解決しない場合の対応

今回エラーの出たコードはこうなっている。

以前作成したYahooを経由してメールを飛ばす方法だ。

ここに「open」処理なんて存在しない。

こんなライブラリの奥底でデコード処理の不具合出ても修正したくない。

というより、コードを見ても何が悪いのか分からなかった……。

解決方法

まずは、次のようなスクリプトで文字コードを確認する。

結果はcp932(Shift-JIS)だった。

色々と解決方法をググった結果、次で回避可能だった。

要するに、「-X utf8」 を python コマンドに指定することで、UTF-8 モードとしてスクリプトを呼び出す。

これは、Windows の環境変数で PYTHONUTF8 を 1 と設定することでも対応可能だ。

【付録】エラー「403: Forbidden」に対する対策

私にとってはこちらが本題。

文字コード対応は終わったが、何度もメール送信していると今度は次のようなエラーが出るようになった。

 
 

ひとつ積んでは父のため。

ふたつ積んでは母のため。

みっつ積んではふるさとの、兄弟我が身と回向えこうする。

 

日も入りあいのその頃は、地獄の鬼が現れて、我を恨むる事なかれと、くろがねの棒を伸べ、積みたる塔を押し崩す。

 

ガシャーン

あぁ・・・・またやり直し・・・。


 

これはこの世のことならず、死出の山路の裾野なる、賽の河原の物語

 
 

と書いて、過去の日記を見直すと前回のメール対応で全く同じこと書いてたわ……

 
 

403 Forbiddenエラーは、ウェブサイトが閲覧禁止になっている状態を表すHTTP​ステータスコード。

恐らくサーバー管理会社側が規制してしまったのかもしれない。

こりゃ、もうお手上げ!

諦めて違う方法を模索した

私のサーバに一旦POSTとして投げて、サーバー側でメール送信することにした。

 

 

最初からこうしておけば良かったわ。時間の無駄だったわ。

そしてサーバー側のPHPは次のようにする。

一週間程度経過したけど、今のところ毎日メールは届いている。

まとめ

最終的にはメールで届くのではなく発注する必要がある。

この調子だと発注失敗とか大量に出そうだな……。

嫌なのは信用買いが成功しても当日信用売りがシステムのバグで出来なかった場合。

手数料無料から始めるつもりだけど、放置してたら悲惨な状況になりそうだな。

タイトルとURLをコピーしました