Slide 1

Slide 1 text

PHP 8.2と8.1で取り込 まれたプルリクエストに ついて

Slide 2

Slide 2 text

自己紹介 てきめん ● https://tekitoh-memdhoi.info ● @youkidearitai ● https://www.youtube.com/use r/tekitohmrp ● https://www.nicovideo.jp/user /2957748 ● https://github.com/youkideari tai オレ

Slide 3

Slide 3 text

要約 tl;dr ● mb_strlen(“\x80\x81”, “CP932”); の\x80のカウ ントが修正されます。 – 今まで1とカウントされましたが、2とカウントされます。 – CP932とは、マイクロソフトが定義したShift_JISの亜種 です。

Slide 4

Slide 4 text

文字コードとは(ざっくりてきとう) ● コンピューターは数値を扱う – 数値に文字を割り当てることでやり取りをしている ● 最近ではほとんどUnicodeのUTF-8を使えば良くなってき た – そのため意識することがないこともあるかも – 業務システムなどでは他の文字コードを使うことがあるかもし れない

Slide 5

Slide 5 text

mbstringとは ● PHPでマルチバイト文字列を扱うPHPの拡張 ● C言語で書かれている – libmbflというライブラリを含んでいて、文字コードそのものの 処理はこれが行う ● 簡単に言うとmb_で始まる関数は大体mbstringの範疇 – よく使うのはmb_convert_encodingでしょうか

Slide 6

Slide 6 text

発見されたSJISバグの修正 ● Fix entries in SJIS multi-byte character lengt h tables for bytes which do not start any valid 2-byte character #10230 – 先程のSJISでの挙動の違いから、1バイト目0x80が1バ イトとして処理されないとおかしいのでその修正 – SJISでは、この修正がなされたことを覚えていますで しょうか…?(今年1月でのPHP勉強会@東京での話)

Slide 7

Slide 7 text

Shift_JISの\x80 ● さきほどのように、\x80をPHPでは2バイトと数える のですが、これを1バイトにするように修正しました – …したはずだったのですが、CP932で漏れてた

Slide 8

Slide 8 text

mblen_table ● Shift_JISなど、ほとんどの文字エンコーディング は、バイト列で文字数がわかるようにできていませ ん。 – そのため、それ用のテーブルが必要です – 内部でmblen_tableというテーブルを持ってい ます

Slide 9

Slide 9 text

● 今回CP932で見つけ た、mblen_tableですが、なん とShift_JIS(SJIS)と違う場所で 管理してました – ext/mbstring/filters/ mbfilter_cp932.c – SJIS-macやSJIS-2004について は対処できてたのに抜けてしまっ た static const unsigned char mblen_table_sjis[] = { /* 0x80-0x9f,0xE0-0xFF */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 }; mblen_tableが違う場所で管理されてた

Slide 10

Slide 10 text

どういう経緯で見つかったか ● More refactoring/fixes/optimizations for CJK t ext handling via mbstring #11259 で見つかった(これ自体はPHP 8.3に反映される) – 散らばってたmbfilter_*.cを、mbfilter_cjk.cにまとめる というものとパフォーマンス改善などが含まれてたもの – ここでてきめんがCP932で修正されてることに気づく ● じゃあ、これはPHP 8.2と8.1で修正しようねということになっ た

Slide 11

Slide 11 text

プルリクエストを作った ● てきめんがプルリクエストを作ることにした – で、つくったのがこちら: Fix mb_strlen is wrong length for CP932 when 0x8 0. #11335 – なんか、英語は自信ないです… – 次のPHP(8.2.8と8.1.21)でリリースされます

Slide 12

Slide 12 text

作り方 ● NEWSに書きます ● コードを修正します ● テストコードを書きます ● プルリクエストを出します

Slide 13

Slide 13 text

NEWSファイル

Slide 14

Slide 14 text

コードの修正

Slide 15

Slide 15 text

テストケースの作成

Slide 16

Slide 16 text

プルリクエストの作成

Slide 17

Slide 17 text

プルリクエストが承認される

Slide 18

Slide 18 text

結果 ● mb_strlen(“\x80a”, “CP932”); の挙動が修正さ れるということになるわけです。 ● \x80は1バイトとして計算します。 ● \x81以降は2バイト文字の可能性があるからこれ でよい

Slide 19

Slide 19 text

結果 ● https://thephp.foundation/blog/2023/06/06/p hp-core-roundup-13/#merged-prs-and-commit s で紹介されてた ヮ(゚д゚)ォ!

Slide 20

Slide 20 text

感想 ● 今回で2回めのマージされたプルリクエストとなり ました ● 貢献しているのはうれしい

Slide 21

Slide 21 text

まとめ ● mb_strlenの挙動の修正を行いました。 ● PHP 8.2.8と8.1.21で反映されます。 ● もし、なにかバグや不思議な点を見つけたらphp- srcのIssueまでお寄せください。

Slide 22

Slide 22 text

近況 ● PHP 8.3.0 alpha1がリリースされました。 – alpha2は22日(明日)にリリース予定です。 – https://wiki.php.net/todo/php83 ● 最近ですとmb_detect_encoding周りでIssueが起票され ました 8.3 crash with mb_detect_encoding #11476 – 8.3は色々いじったので、暇あったら動かしてみてくれると嬉しい

Slide 23

Slide 23 text

ご清聴ありがとうございました