【PHP】PHPの文字列に対する将来について~mbstringとgrapheme関数~ #PHP
TOP > てきとうにこらむ > ゲーム作りとプログラミング日記 > 【PHP】PHPの文字列に対する将来について~mbstringとgrapheme関数~ #PHP
PHPの文字列に対する将来
PHPは、文字列に対して扱いがしやすいLL言語の一つと考えています。その一面から意見をまとめてみようと思います。
Grapheme clusterは万能か
書記素クラスター(grapheme cluster)は、Unicodeにおける「1文字に見える文字」の概念であるとされます。結合文字や異体字セレクターなど、それぞれをカバーしていて、万能な概念のように見えますが、そうでもありません。
例えば、顔の絵文字にZWJ(Zero Width Joiner)を加えてみるという文字を考えてみましょう。
👨👩👧👧👩👧👧👨👩👧
👨👩👧👧👩👧👧👨👩👧
— てきめん (@youkidearitai) March 1, 2025
このように、「3文字に見える」と思いますが、これは「1書記素クラスター」です。すべての絵文字の間にZWJが挟まっているからです。なぜこのようなことになるかというと、「フォントに対応するグリフがない」からにつきます。というか、すべてのパターンを網羅する絵文字のグリフを作ることなど不可能に近いのです。
したがって、書記素クラスターは完全には万能ではない、銀の弾丸ではないということをわかっていただきたいです。
mbstringは時代遅れか
mbstringはどうなるでしょうか。mbstring拡張はUCSという方法でUnicodeのコードポイント分の処理を行うPHP拡張です。Unicodeのコードポイントでは、上述した絵文字は「19コードポイント」となります。mb_strlen関数で19と返ってきます。
絵文字や、結合文字、異体字セレクターを扱えない(1コードポイントとして扱われる)のは不便ではあるものの、依然として必要な拡張であることには変わりないです。
たとえば、その普段使っている文字がコードポイントではどのようになっているのかを調べるなどのユースケースが求められます。1書記素クラスターでは何コードポイント使用しているのかという観点で知りたいときがあります。そういうときに使われるだろうと予測しています。
Unicodeのコードポイントは書記素クラスターからすると低レイヤーになってしまっている可能性がありますが、未だに有用な関数群であることには間違いがないです。
総括
PHPはこれから、絵文字の対応という観点から、書記素クラスターに手を出していくことになるかと思われます。一方で、mbstringは時代遅れ感が出てくるかもしれません。しかしながら、書記素クラスターはどういうコードポイントで構成されているの?を調べる際には重要な関数群であることは間違いがないと確信しています。
PHPは歴史的に見てLL言語として、文字列を扱いやすい言語です。これからもニーズに合わせて書記素クラスター単位、コードポイント単位での関数のユースケースなどを調べていけたら良いと思っています。
また、どうしても言葉の世界ですから、日本人として日本語の観点からこれがほしい、と思っていてもなかなか欧州などの方々からの支持が得られないのがもどかしいです。
ですが、文字を扱いやすくし続ける努力はしていきたいと思っています。
よろしくお願いします。