2013年2月アーカイブ

PHPで日本語などのマルチバイト文字を含む文字列の、正確なバイト数を求める方法。

普通ならstrlen関数で文字コードに関係なく文字列の"バイト数"が取得できるけど、この関数はmb_strlen関数でオーバーロードされる可能性がある。そうなると、返されるのはバイト数ではなく文字数になってしまうので都合が悪い。

bin2hex関数で変換して2で割る方法なんかもあるらしいけど、バイト数を測るために無用な変換をするのもどうかと思うし。

んで、思いついたのが次の方法。


$s = 'あいうabc';
$len = mb_strlen($s, 'US-ASCII');


 $lenの値は、UTF-8環境であれば12 (3byte * 3文字 + 1byte * 3文字)に、EUC-JP/ShiftJIS環境であれば9 (2byte * 3文字 + 1byte * 3文字)になります。US-ASCII文字コードセットにはマルチバイト文字がない、という性質を利用した方法だけども・・・、この方法じゃダメかな?

mb_strlen関数の内部処理がどうなっているか分からないけど、US-ASCIIなら渡される文字列に対する変換処理は行われないのではないかと勝手に思っている。