
Docker環境でPHPのbasename関数が日本語を消してしまう問題の解決方法
Dockerで用意した環境のphpでbasename関数をつかって日本語文字が消えてしまう問題が発生していました。
Googleで検索すると大体は setlocale(LC_ALL, 'ja_JP.UTF-8');
すればいいと書いてあったので脳死で設定してみましたが、ダメでした。
|
|
ちなみにASCII文字が含まれると日本語が削られないという謎現象が発生してて、よくわからんってなっていました。
ホスト側のPCでphpを実行したところ basename
関数を使っても問題はおきなかったのですが、なぜかDockerコンテナ側のphpで実行すると発生していました。
setlocaleが実はfalseを返してた
setlocale関数のマニュアル に以下の記載がありました。
setlocale() の戻り値は、 PHP が実行されているシステムに依存します。 システムの setlocale 関数が返す値を返すためです。
試しに var_dump(setlocale(LC_ALL, 'ja_JP.UTF-8'))
を実行したところ結果はfalseが返ってきました。
正常な場合はどうなんだろうと思ってホスト側PHPで実行したところ以下のように文字列が返ってきました。
|
|
おそらくですがDocker側のlocaleの設定がうまくできてないのかと。
localeの設定をたしかめてみる。
Dockerコンテナに接続して locale
コマンドを実行することで、localeの設定を確認できます。
試しに実行してみたところ以下のような結果に・・・。
|
|
ロケールがPOSIXになっていたため basename
関数でトラブルがおきていたわけですね・・・。
localeにja_JP.UTF-8を設定する
デフォルトのphp-fpmのコンテナはdebianなので以下のようにDockerfileに追加しました。
|
|
これでコンテナをビルドすれば日本語でも basename
が正しく実行されます。
試しにlocaleコマンドで正しく設定されているか確認しましょう。
|
|
まとめ
- basenameで日本語文字列の処理がおかしい場合はsetlocaleを設定してみる
- setlocaleは戻り値を必ずチェックする
- localeコマンドでos側のlocale設定を確認する