Love澤's Room

技術系ネタをまとめていたブログ。カテゴリにこだわらず更新していこうかと思います。

PHPで日本語名を含む文字列の文字数を数えるときの注意点

やりたいこと

今回やりたいことは、

  • 日本語を含むファイル名の拡張子部分を切り取りたい

ということです。

注意点

注意点としては

  • 日本語を含む場合は、マルチバイト対応のメソッド(mb_***)を使おう

ということです。
当たり前のことかもしれないですが、今後繰り返さないようにメモしておきます。

改善前

以下の例では、例えば「hogehoge.txt」というファイル名は「hogehoge」となりますが、「ほげほげ.txt」は「ほげほげ.txt」のままでした。

<?php
$image_name = "" . htmlentities(mb_substr($_FILES["file"]["name"], 0, strlen($_FILES["file"]["name"])-4), ENT_QUOTES, 'UTF-8');
?>

文字列切り取りを行うときはmb_substrを使っていたのに、文字数を数えるときにマルチバイトに対応していないstrlenを利用していたのがうまくいかない理由でした。

改善後

上の例のstrlenをmb_strlenに修正するとうまくいきます。

<?php
$image_name = "" . htmlentities(mb_substr($_FILES["file"]["name"], 0, mb_strlen($_FILES["file"]["name"])-4), ENT_QUOTES, 'UTF-8');
?>

簡単な説明

mb_strlenで文字数を取得して、最初の文字~最後から4番目の文字までをmb_substrで切り出す、という感じです。

mb_strlenで指定した文字列の文字数を取得します。
PHP: mb_strlen - Manual

mb_substrで指定した文字列の部分文字列を取得します。
PHP: mb_substr - Manual

ちなみに、htmlentitiesはセキュリティ上の理由でつけてます。htmlentitiesについては以下のサイトがわかりやすかったです。
PHPプロ!TIPS+