basenameを取得したところ、名前の頭の日本語が消失するという現象があり、調べたところsetlocaleで回避できるという記事が見つかりました。
https://blog.bgbgbg.net/archives/2331
しかしながら、下記の通りsetlocaleをしても、setlocaleが有効にならず、var_dumpしたところ、falseが返ってきました。
サーバーに言語が入っていないと思い、サーバーで確認したところ「ja_JP.UTF-8」は存在していました。
なぜsetlocaleが有効にならないか分からないのですが、どなたかご教示頂ければ幸甚で御座います。
どうぞよろしくお願い申し上げます。
print_r(mb_detect_order());
// (
// [0] => ASCII
// [1] => UTF-8
//)
$name = "/etc/ハローワールド0101.pdf";
//現在のlocaleを確認
echo setlocale(LC_ALL, 0); // C
setlocale(LC_ALL,'ja_JP.UTF-8');
// var_dump(setlocale(LC_ALL,'ja_JP.UTF-8')); // bool(false)
$filename = basename($name);
echo $filename; //0101.pdf
サーバー側の状況
$ locale -a
//日本語部分抜粋
ja_JP
ja_JP.eucjp
ja_JP.ujis
ja_JP.utf8
japanese
japanese.euc
$ locale
LANG=ja_JP.UTF-8
LC_CTYPE="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_PAPER="ja_JP.UTF-8"
LC_NAME="ja_JP.UTF-8"
LC_ADDRESS="ja_JP.UTF-8"
LC_TELEPHONE="ja_JP.UTF-8"
LC_MEASUREMENT="ja_JP.UTF-8"
LC_IDENTIFICATION="ja_JP.UTF-8"
LC_ALL=
環境
OS : amazon linux2
PHP : 7.2
webサーバー : nginx 1.12.2
試したこと
下記のsetlocaleが全てfalseでした。
var_dump(setlocale(LC_ALL,'ja_JP.utf8')); // bool(false)
var_dump(setlocale(LC_ALL,'ja_JP')); // bool(false)
var_dump(setlocale(LC_ALL,'ja_JP.eucjp')); // bool(false)
var_dump(setlocale(LC_ALL,'ja_JP.ujis')); // bool(false)
var_dump(setlocale(LC_ALL,'japanese')); // bool(false)
var_dump(setlocale(LC_ALL,'japanese.euc')); // bool(false)
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
check解決した方法
0
サーバー側の状況
$ locale -a
C
C.utf8
解決方法
dameo様のアドバイスで、Cロケールのutf8でもOKということを伺い、下記を試したところbasenameで日本語を取得することができました。
$name = "/etc/ハローワールド0101.pdf";
//現在のlocaleを確認
echo setlocale(LC_ALL, 0); // C
setlocale(LC_ALL,'C.UTF-8');
// setlocale(LC_ALL,'C.utf8'); //こちらでも可
$filename = basename($name);
echo $filename; //ハローワールド0101.pdf
サーバー設定による解決方法
dameo様からサーバーの設定が足りないこと、またコマンドはlocalectlを使用するというアドバイスを頂戴し、下記を実行したところ、phpでsetlocaleする必要もなくなりました。
//設定を確認
$ localectl status
System Locale: LANG=en_US.UTF-8
//日本語に設定
$ localectl set-locale LANG=ja_JP.utf8
//設定を反映させるために再起動
$ sudo reboot
上記実行後の状況です。
echo setlocale(LC_ALL, 0); //LC_CTYPE=ja_JP.UTF-8;
$name = "/etc/ハローワールド0101.pdf";
$filename = basename($name);
echo $filename; //ハローワールド0101.pdf
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.36%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
maisumakun
2020/08/27 16:11
PHPファイル自体の文字コードは何でしょうか?
k.t.est
2020/08/27 16:19
mb_detect_orderしたところ、UTF-8でした!
dameo
2020/08/31 10:41
locale -aで出力されている
setlocale(LC_ALL,'ja_JP.utf8');
で試してみてください。
k.t.est
2020/09/01 17:11
setlocale(LC_ALL,'ja_JP.utf8');
を試してみましたが、状況変化なしでした。
dameo
2020/09/01 17:22
上記setlocaleの戻り値はfalseでしたか?
また試したことにも追記していきましょう
dameo
2020/09/01 17:32
あと、地域が日本、言語が日本語以外でも、エンコーディングがutf-8なら表示について言えば大丈夫なので、Cロケールなどでutf-8があったらそちらを試してみてください。
k.t.est
2020/09/01 17:49
Cロケールで無事設定できました!ありがとう御座いました!
dameo
2020/09/01 17:55
多分Amazon Linux 2でロケールの設定が足りないのだと思いますよ
後で確認しといてください
今どきはlocaleコマンドよりも、localectlコマンドを使うようです
それでは失礼します