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

PHP 8.1からUTF-16のmb_substitute_character関数の挙動が修正されている部分がある

TOP > てきとうにこらむ > ゲーム作りとプログラミング日記 > PHP 8.1からUTF-16のmb_substitute_character関数の挙動が修正されている部分がある

https://3v4l.org/QR059

PHP 8.1の変化を調べている

PHP 8.1で起こった違いが、色々と困っているので、その違いなどを調べている。今回はmb_substitute_character。これの挙動が修正されてた。

治っている

PHP 8.1とそれ以外とでは、違いが発生している。例えば以下のコード。UTF-16で違う出力になる。https://3v4l.org/QR059

<?php

var_dump(mb_convert_encoding(mb_convert_encoding("~", "JIS", "UTF-16"), "UTF-8", "JIS"));

PHP 8.1.0からは string(1) ? となっていて、それ以前は string(0) "" である。UTF-16では半角文字だろうと 0x00 が先頭バイトにある(リトルエンディアンの場合)。だから、この文字はUTF-16としては不正な文字なので変換できない。そのため、本来であれば mb_substitute_character に指定されている文字が割り当てられるはずというのがこの挙動である。

ところが、PHP 8.1以前では、何故かそのような挙動になっていなかったので、それが修正されたというのが今回の話。

mbstringの変更を追いかけていきたい所存

PHP 8.1から、mbstringの変更がかなり入ってきている。そのため、この変更を追いかけていかないと、後方互換性のない挙動を起こされる可能性もある。それを追いかけていきたい。