Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Garoon開発チームではPHP8.1の仕様変更とどう向き合ってきたのか / How we...
Search
Chiba Tairi
April 05, 2023
Programming
0
950
Garoon開発チームではPHP8.1の仕様変更とどう向き合ってきたのか / How we have responded to the PHP 8.1 mbstring specification changes
【Cybozu Tech Meetup #21】PHPerKaigi 2023 後日談 発表スライド
https://cybozu.connpass.com/event/277790/
Chiba Tairi
April 05, 2023
Tweet
Share
More Decks by Chiba Tairi
See All by Chiba Tairi
PHP のプロファイルを Grafana Pyroscope で見たくてライブラリを自作した
pakutoma
1
530
PHP8.1で大改修が入ったと噂のmbstringで実際に遭遇した問題たち / Problems encountered with mbstring in PHP 8.1
pakutoma
0
250
Other Decks in Programming
See All in Programming
手軽に積ん読を増やすには?/読みたい本と付き合うには?
o0h
PRO
1
110
生成AIを活用したリファクタリング実践 ~コードスメルをなくすためのアプローチ
raedion
0
120
30分でDoctrineの仕組みと使い方を完全にマスターする / phpconkagawa 2025 Doctrine
ttskch
3
520
Reactive Thinking with Signals and the new Resource API
manfredsteyer
PRO
0
120
無秩序からの脱却 / Emergence from chaos
nrslib
1
8.8k
複数チーム並行開発下でのコード移行アプローチ ~手動 Codemod から「生成AI 活用」への進化
andpad
0
180
2025 컴포즈 마법사
jisungbin
0
150
AIエージェントでのJava開発がはかどるMCPをAIを使って開発してみた / java mcp for jjug
kishida
4
770
TypeScript 5.9 で使えるようになった import defer でパフォーマンス最適化を実現する
bicstone
1
430
しっかり学ぶ java.lang.*
nagise
1
440
競馬で学ぶ機械学習の基本と実践 / Machine Learning with Horse Racing
shoheimitani
14
13k
なあ兄弟、 余白の意味を考えてから UI実装してくれ!
ktcryomm
1
450
Featured
See All Featured
Agile that works and the tools we love
rasmusluckow
331
21k
Designing Experiences People Love
moore
142
24k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
1.8k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
1.6k
Building a Modern Day E-commerce SEO Strategy
aleyda
45
8.1k
Art, The Web, and Tiny UX
lynnandtonic
303
21k
How GitHub (no longer) Works
holman
315
140k
The World Runs on Bad Software
bkeepers
PRO
72
12k
The Art of Programming - Codeland 2020
erikaheidi
56
14k
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
A Modern Web Designer's Workflow
chriscoyier
697
190k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.3k
Transcript
0 #Garoon 開発 #完成度低いの歓迎LT大会 Garoon開発チームでは PHP 8.1の仕様変更と どう向き合ってきたのか 〜 mb_detect_encodingを例に
〜 サイボウズ Garoon開発チーム 千葉 泰理(ぱくとま)
1 #Garoon 開発 #完成度低いの歓迎LT大会 1 - タイトルを変えました - PHPerKaigiで話したいことは話した -
社内イベントなので、もうすこし社内っぽいことを話したい - とは言っても、結局mbstringのことを話します - ぱくとま(千葉 泰理) - 4月でサイボウズ2年目になりました - Yukimiチームに所属 - GaroonのPHPやライブラリのアップデート対応 おことわり & 自己紹介
2 #Garoon 開発 #完成度低いの歓迎LT大会 2 - バイト列の文字エンコーディングを「検出」する関数 - 実際には、最も可能性が高いエンコーディングを「推測」 -
エンコーディングの候補を配列で渡す - 日本語なら[ASCII, UTF-8, JIS, EUC-JP, SJIS-win]とか - 一番もっともらしいものを選ぶ(ということになっている) - PHP 8.0までは、最初に出現したvalidな候補を返す mb_detect_encoding() とは?
3 #Garoon 開発 #完成度低いの歓迎LT大会 3 - 主にメールの受信に利用されていた - メールのヘッダーと本文のエンコーディングを推測 -
MIMEヘッダーのcharset指定は無視されていた - 本文から推測した方が成功率が高いという判断らしい - 経緯は不明、過去の規格違反メールへの対策? Garoon での使われ方
4 #Garoon 開発 #完成度低いの歓迎LT大会 4 - PHP 8.1でmb_detect_encoding()の仕様が変更 - エンコーディングの配列を渡したとき
- PHP 8.0まで - 正常にエンコードされた最初のエンコーディングを返す - PHP 8.1から - 一番それらしいエンコーディングを返す mb_detect_encoding()のサイレント仕様変更
5 #Garoon 開発 #完成度低いの歓迎LT大会 5 - 一番それらしいエンコーディング……? - 文字列に対してスコアリングする -
常用漢字外の漢字や、U+FFFF以上の文字(絵文字など)は 低いスコアが付く - 出現頻度が低い文字で誤検出が発生 - 例えば、🍣(寿司)をUTF-8ではなくSJIS-winとして認識 - Garoonでは、名字の異体字が文字化けした mb_detect_encoding()の検出方法
6 #Garoon 開発 #完成度低いの歓迎LT大会 6 - PHP 8.0の挙動を再現したラッパー関数を作成 - どうやって再現する?
- mb_check_encodingで代用すれば良いと思っていた - Alex Dowad氏もそう言っていたし……。 - mb_check_encodingに様々な問題が発覚した mb_detect_encoding() のラッパー関数
7 #Garoon 開発 #完成度低いの歓迎LT大会 7 - ASCIIかどうかの判定基準の違い - PHP 8.0のmb_detect_encoding
- 0x20-0x80とCR, LF, HTAB, NULのみを許容 - mb_check_encoding - 0x00-0x7Fを全て正しいASCIIと判定 - JISをASCIIと誤認識 - mb_check_encodingの仕様としては正しい mb_check_encoding()の問題 その1
8 #Garoon 開発 #完成度低いの歓迎LT大会 8 - JISかどうかの判定基準の違い - PHP 8.0のmb_check_encoding:
- 7bit文字+エスケープシーケンスのみをJISとして判定 - PHP 8.1のmb_check_encoding: - 8bitの半角カナなどをJISとして判定 - エスケープシーケンスが欠落していてもJISとして判定 - EUC-JPや壊れたJISをJISとして誤認識 mb_check_encoding()の挙動 その2
9 #Garoon 開発 #完成度低いの歓迎LT大会 9 - JISをASCIIと誤認識する - 以前の挙動を再現した関数を用意して対応 -
EUC-JPなどをJISと誤認識する - PHPに独自パッチを当てて対応 - PHP側に聞いてみたが、正常動作とのこと - エスケープシーケンスが欠落したJISを誤認識する - PHP側にissue登録→修正 ラッパー関数を作成する際の対応
10 #Garoon 開発 #完成度低いの歓迎LT大会 10 - エスケープシーケンスが欠落したJISを誤認識する件 - JISとISO-2022-JPは改修された🎉(おまけでUTF-7も) -
ISO-2022-JPの変種(-2004など)の対応はまだ - PR書きたいんですが、ちょっとお休み中です - 8bit 半角カナがJISとして判定される件 - 社内ではパッチを当てているものの、今後どうするかは検討中 - PHP側の実装を使えるのが理想 PHP側への働きかけ
11 #Garoon 開発 #完成度低いの歓迎LT大会 11 - ひとまず修正リリースは出来たが、良い状態ではない - 複雑怪奇な動作をするラッパー関数 -
PHP本体に取り込まれなかった独自パッチ - メール機能の文字コード周りをほとんど作り直す - MIMEヘッダーを出来るだけ利用 - mb_detect_encodingの利用は必要最低限に - 規格違反メールの文字化けはある程度許容したい - 改修に向けて作業中 根本解決への道筋
12 #Garoon 開発 #完成度低いの歓迎LT大会 12 - 仕様変更は、コード品質の低い部分ほど影響が大きい - 必然的に厳しいコードを目にする機会が増える -
プロダクトの光と闇だと、闇を目にするほうが圧倒的に多い - プロダクトの中で一番問題がある部分を改善していける - PHPアップデートの度に Garoon は進化しています - 仕様変更はプロダクトの弱い部分を成長させる機会 レガシーコードとの戦い
13 #Garoon 開発 #完成度低いの歓迎LT大会 13 - 完成度低いポイント:Garoonのメール & mbstring -
つらい - 見つけたものは改善出来る、だから良いこと! - GaroonでもOSSでも一緒ですね - 社内外のレガシーコードに立ち向かっています - ありがとうございました! まとめ