私が書く場合:
rename('php109.tmp','test.jpg');
その後、問題なく動作しています。
しかし、それを次のように変更すると:
rename('php109.tmp','中文.jpg');
それは報告します
"そのようなファイル、又はディレクトリはありません..."。
しかし、マルチバイト文字をデータベースに書き込んで読み取ることができる場合、名前を変更すると失敗するのはなぜですか?
setlocale(LC_ALL, array("es_ES.utf-8","es_ES@euro",'es_ES'));
ロケールが正しく設定されていることを確認するために、または国コードを実行してみましたか?
この呼び出しが「utf-8」を含むものを返さない場合は、失敗したことを意味し、現在のロケールを返します。
ファイル システムは必ずしも UTF-8 を使用するとは限りません。たとえば、これはウィキペディアがNTFSについて述べていることです。
NTFS では、名前のエンコードに任意の 16 ビット値のシーケンス (ファイル名、ストリーム名、インデックス名など) を使用できます。これは、UTF-16 コードポイントがサポートされていることを意味しますが、ファイル システムは、シーケンスが有効な UTF-16 であるかどうかをチェックしません (短い値の任意のシーケンスを許可し、Unicode 標準のものに制限されません)。
文字セットを変換するには、iconv()を使用する必要がある場合があります。
このサンプルが役立つはずです。言語コード ページを見つけて、それに置き換える必要があります。私は次のコードをテストし、アラビア語/ペルシャ語の名前の Windows で動作します。
$newname = iconv("utf-8", "cp1256","گچپژ");
echo rename("1.txt", $newname);
mbstring がこの特定の問題とは何の関係もないことはほぼ確実です。ここでの問題は、.php ファイルのエンコーディングに依存していると思います。
コード エディターでファイルのエンコードを UTF-8 (BOM なし) に変更してみてください。