てきとうなさいと べぇたばん

PHP 8.4でmb_ucfirst関数とmb_lcfirst関数を作りました

TOP > てきとうにこらむ > ゲーム作りとプログラミング日記 > PHP 8.4でmb_ucfirst関数とmb_lcfirst関数を作りました

mb_ucfirst関数とmb_lcfirst関数を作りました

この度、PHP 8.4にてmb_ucfirst、mb_lcfirst関数を作りました。RFCは https://wiki.php.net/rfc/mb_ucfirst です。

あらすじ

2024年1月5日にこのようなFeature requestが来たことがきっかけです https://github.com/php/php-src/issues/13075

そのStack Overflowによると、以下のようなコードが提示されていました。

function mb_ucfirst(string $str, ?string $encoding = null): string { return mb_strtoupper(mb_substr($str, 0, 1, $encoding), $encoding) . mb_substr($str, 1, null, $encoding); }

先頭の文字を大文字にするのは全世界で有効なのか?

しかしながら、 mb_strtoupper 関数は確かにフランス語やドイツ語などでは有効になりますが、全世界の文字を扱っているmbstringからすると、本当にそれが正しいのか最初はわかりませんでした。先述したFeature requestやPHP Internalsでやりとりをした結果、Unicodeにおけるタイトルケース(Title case)が有効であることがわかりました。幸運にも、これを使用している関数がありました。それが mb_convert_caseMB_CASE_TITLE です。このコードを一文字目に使用し、2文字目以降は mb_substr とすればどの言語でも大丈夫であろうということでこれを実装しました。

PHPのコードで示すと以下のようになります。

function mb_ucfirst(string $str, ?string $encoding = null): string { return mb_convert_case(mb_substr($str, 0, 1, $encoding), MB_CASE_TITLE, $encoding) . mb_substr($str, 1, null, $encoding); }

実装

仕様の決定に比べて、実装自体はそんなに難しくはなかったです。とはいえ、いつもどおりにAlexさん、Nielsさんにレビューを受けて改善していきまして、この度のマージとなりました。

感想

こちらは例えば(いわゆる)全角大文字小文字のアルファベットなどにも有効ではあるので、一応日本語の文字コードにも有効ではありますが、おそらく恩恵を受けるのはラテン語圏が中心ではないでしょうか。とはいえ、例えばベトナム語でも使えるようになりますし、全世界で使える関数になったのだと思います。

2024/03/23 19:12