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
960
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
560
PHP8.1で大改修が入ったと噂のmbstringで実際に遭遇した問題たち / Problems encountered with mbstring in PHP 8.1
pakutoma
0
250
Other Decks in Programming
See All in Programming
PostgreSQLで手軽にDuckDBを使う!DuckDB&pg_duckdb入門/osc25hi-duckdb
takahashiikki
0
240
React 19でつくる「気持ちいいUI」- 楽観的UIのすすめ
himorishige
11
5.3k
Canon EOS R50 V と R5 Mark II 購入でみえてきた最近のデジイチ VR180 事情、そして VR180 静止画に活路を見出すまで
karad
0
140
Pythonではじめるオープンデータ分析〜書籍の紹介と書籍で紹介しきれなかった事例の紹介〜
welliving
3
780
AI Agent の開発と運用を支える Durable Execution #AgentsInProd
izumin5210
7
1.7k
Findy AI+の開発、運用におけるMCP活用事例
starfish719
0
2.1k
公共交通オープンデータ × モバイルUX 複雑な運行情報を 『直感』に変換する技術
tinykitten
PRO
0
180
Python札幌 LT資料
t3tra
7
1.1k
GISエンジニアから見たLINKSデータ
nokonoko1203
0
190
LLMで複雑な検索条件アセットから脱却する!! 生成的検索インタフェースの設計論
po3rin
4
1.1k
CSC307 Lecture 05
javiergs
PRO
0
470
インターン生でもAuth0で認証基盤刷新が出来るのか
taku271
0
150
Featured
See All Featured
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
1.8k
Agile that works and the tools we love
rasmusluckow
331
21k
Making the Leap to Tech Lead
cromwellryan
135
9.7k
How to make the Groovebox
asonas
2
1.9k
A Soul's Torment
seathinner
4
2.1k
Building Applications with DynamoDB
mza
96
6.9k
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
Speed Design
sergeychernyshev
33
1.5k
Fashionably flexible responsive web design (full day workshop)
malarkey
408
66k
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
280
[SF Ruby Conf 2025] Rails X
palkan
0
710
Tell your own story through comics
letsgokoyo
1
780
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でも一緒ですね - 社内外のレガシーコードに立ち向かっています - ありがとうございました! まとめ