Upgrade to Pro — share decks privately, control downloads, hide ads and more …

PHP8.2にバージョンアップしたら文字化けが発生して道頓堀に飛び込みたくなった話

藤掛治
March 11, 2024
1.3k

 PHP8.2にバージョンアップしたら文字化けが発生して道頓堀に飛び込みたくなった話

藤掛治

March 11, 2024
Tweet

Transcript

  1. 2 自己紹介 • 株式会社ラクス ◦ 2014年3月入社 ◦ メールディーラーの運用・サポートエンジニア • 吹田市在住

    • 家族は妻と中2男子 • 趣味はサッカー ◦ ボランチ ◦ ガンバ大阪のガチサポーター 藤掛治(ふじかけおさむ)
  2. © RAKUS Co., Ltd. 4 PHP8.2にバージョンアップしたら文字化けが 発生して道頓堀に飛び込みたくなった話 株式会社ラクス 大阪第一開発部メールディーラー開発課 運用・サポートエンジニアチームリーダー

    藤掛治 PHP8.2にバージョンアップしたら文字化けが 発生して道頓堀に飛び込みたくなった話 株式会社ラクス 大阪第一開発部メールディーラー開発課 運用・サポートエンジニアチームリーダー 藤掛治
  3. メールディーラー 開発課 メールディーラー 開発課 6 メールディーラー開発チームの構成 運用サポート チーム 実装チーム ・実装

    ・オフショア対応 ・問合わせ対応 ・運用の課題解決 上流チーム ・要件定義 CSチーム ・問合わせ1次対応 ・顧客支援 製品企画
  4. 7 メールディーラーのご紹介 • メール共有管理サービス ◦ メールの処理を複数人で対応可能にするWebメーラー ◦ 主に企業の問い合せの対応と管理に利用されています ▪ 対応漏れや重複対応を防止する

    ▪ 問い合せに起因するアクションの管理 • メール共有管理システム市場で15年連続売上シェアNo1(※) • 累計導入社数8000社以上 ※出典:ITR「ITR Market View:メール/Webマーケティング市場2024」メール 処理市場:ベンダー別売上金額推移およびシェア2009-2023年度(予測値)
  5. 9 いろんなことの一例 1. サーバが差し押さえられそうになる ◦ あるお客様が警察の捜査対象になり、その証拠集めのため ◦ サーバは勘弁してもらい、メールデータを引っこ抜いて提出 ◦ 人生で初めて捜査令状を見る。多分コレが最後。

    2. 嫌がらせのメールを大量に受信し、ハードディスクが枯渇しそうになる ◦ 「このままだと日曜日にディスクが枯渇します!!」 3. スパムメールを受信するのは日常茶飯事 ◦ Fromがない、フィッシングメール、文字化けしたメール などなど、いろんなことが起こります
  6. 12 ここでメールの構造の説明 メール ヘッダ(header) 本文(body) テキストパート Content-Type:text/plain; charset=”utf-8” ・ ・

    ・ HTMLパート Content-Type:text/html; charset=”utf-8” ・ ・ ・ メールは大きく2つにわかれている • ヘッダ(header) ◦ 属性情報(日付、件名など) ◦ 経由したサーバ などが記載 • 本文(body) ◦ メールの本文 ◦ テキストメール、HTMLメール、 添付ファイルなどいくつかに分か れている このフォーマットはRFCで規定されている
  7. 13 文字化けした原因 メール ヘッダ(header) 本文(body) テキストパート Content-Type:text/plain; charset=”utf-8” ・↑これがない ・

    ・ HTMLパート Content-Type:text/html; charset=”utf-8” ・↑これがない ・ ・ 文字コードの設定がない • 文字コードがわからないのにどう やって表示せよというのだ? • そもそもRFCに違反している でもお客様の話をよく聞くと・・・ • 昨日受信したメールは見える • 今日の受信から文字化けした つまりリリース前は文字化けはしてい なかった
  8. 15 文字化けした理由 メールディーラーの仕様で、文字コードの設定がない場合は・・・  mb_detect_encodingを使って文字コードを検出  検出した文字コードでメールをエンコードして表示する PHPのバージョンアップでmb_detect_encodingの仕様が変わった • mb_detect_encoding(評価するデータ,

    エンコードリスト)  8.0以前では引数のエンコードリストの前から順に評価して適切なものがあれば、そ れが採用された  8.1以降は引数のエンコードリストをすべて評価して最も適切なものを採用する これにより、想定した文字コードを返さなくなり文字化けが発生! Sift-JISが欲しいのにどうしてもASCIIが返ってくる
  9. 19 なのでコードを修正 $encodeList = [エンコードの配列] ← 1 for ($encodeList =>

    $encode) { if (mb_check_encoding(メールデータ, $encode) ← 2 ここでほぼ捕捉できるはず return $encode } mb_detect_encoding(メールデータ, $encodeList); ← 3 1. エンコードする文字コードの候補をリスト化 2. mb_check_encodingを使って上記1のリストでチェックする 3. 合致する文字コードがなかったらmb_detect_encodingを使ってリストに近い文 字コードを探す
  10. メールディーラー 開発課 メールディーラー 開発課 実は開発中に開発チームは文字化けすることを知って いた 23 運用サポート チーム 実装チーム

    上流チーム 報告漏れ CSチーム ヘルプディスク ・問い合わせ1次対応 ・顧客支援 説明しんどい 文字化けするこ とを知っていた 謝罪 「実はわかっていました」 なんて言えない。ゆえに板挟み