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_case
の MB_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さんにレビューを受けて改善していきまして、この度のマージとなりました。
感想
こちらは例えば(いわゆる)全角大文字小文字のアルファベットなどにも有効ではあるので、一応日本語の文字コードにも有効ではありますが、おそらく恩恵を受けるのはラテン語圏が中心ではないでしょうか。とはいえ、例えばベトナム語でも使えるようになりますし、全世界で使える関数になったのだと思います。