mbstringってどうなるんでしょうね?2023年のぼくの視点から
TOP > てきとうにこらむ > ゲーム作りとプログラミング日記 > mbstringってどうなるんでしょうね?2023年のぼくの視点から
mbstringの将来
2023年現在、Major overhaul of mbstringやPHP Internalsの投稿、Issueなどを見て回るに連れて、PHPのmbstring拡張というものがどのような立ち位置なのかがなんとなーくわかってきたので文章にしようと思いました。
mbstringは難しい
まずひとつに、mbstring拡張は日本人が書いてきたこともあり、「難しい」というのがあります。我々のような徳丸本や安全なウェブサイトの作り方を見て勉強している日本人が使うには不自由はしにくいと思いますが、海外ではそうはいきません。
それが発覚したのが Inconsistency mbstring functions というメールです。ぼくはここで、「その挙動に対して日本人はmb_check_encodingを挟む」と発言しましたが、Alexさんには理解してもらえたものの、大抵の人々は理解していないように思います。なお、PHP Internalsにいる人々は、UTC0〜5くらいの人々で成り立っていると思われます。
mb_strposでは、内部でUTF-8に変換して検索していますが、mb_substrでは違うエンコーディングでsubstrしています。このような挙動の一貫性のなさを指摘されたものではあるものの、「不正なエンコーディングには例外を投げるべきである」といったあたりは理解できる人もいるのではないでしょうか。ただし、現状のmbstringではそのような後方互換性のなさは逆に大きな混乱を及ぼすことにもなるでしょう。
mbstringというPHP拡張は、長らく日本人向けの拡張という立ち位置ではあったものの、絵文字などを通じて文字コードと無縁で居られなくなった海外の人たちで間違った使われ方をするようになった、上級者向けの拡張という位置づけになったのだと思います。php-srcを見てるとそのように感じます。
— てきめん (@youkidearitai) December 7, 2023
mstdn.jpより
PHPのmbstringは、日本人では専門家による教育・冊子により常識とされていることが、海外ではそんな人・モノがないために、正しくない使われ方をしているように思えます。それくらいには上級者向けのextensionに思えます。
日本人から見たフールプルーフのような扱われ方をしたときの、mbstringの挙動は未知であると言えるでしょう。これに対する対策としては、InvalidCharacterEncodeExceptionのような例外を投げるmb_*関数が作られたとしたら、日本人は大変困惑することになるでしょう。しかし、最早文字コードから逃れられなくなった現状、このような例外を加える改修がなされてもおかしくないとも感じます。
libmbflの依存をなくそうとしている?
ちょっとまだわかっていないのですが、現在 Use optimized implementation of mb_strcut for Japanese mobile vendor UTF-8 variants #12876 で、mb_strcutの改修を行っていますが、この関数がlibmbflに依存している最後の関数だそうです。そのため、mb_strcutの改修を行っているのをレビューしています。
libmbflは速度が遅かったりするため、その問題を解決するためにAlexさんが興味を持ったそうですが、これからのmbstringはどのようになっていくのでしょうか。まだ大局が見えていないので、わかったらブログにでも書こうかなと思います。
文字コードとは歴史的な積み重ねによるもの
文字コードは、皆さんご存知歴史的な積み重ねによるものになります。その中には波ダッシュ問題、Shift_JISならば5c問題などと色々あります。不正な文字エンコーディングはアプリケーションのセキュリティにも関わります。色々とありますが興味あったらかいつまんで見てもらうと面白いと思います。文字コードにまだできていない文字は、日本語はもちろん、中国語に莫大にあります。ですので、「文字ってなんだろう」というところから始めると面白いかもしれませんね。
もしかすると、ご自身の名前の漢字を調べるのも面白いと思います。なお、ぼくの本名の名のほう「侑弥」は、1981年以前には名付けることはできませんでした(戦前に遡れば可能)。ある意味キラキラネームですね。