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はセキュリティ上の理由でつけてます。(詳細については参考サイト貼っていましたが、サイト終了していました)

コメント

タイトルとURLをコピーしました