Linux を実行しているサーバーに Unicode 文字を含むファイルがあります。サーバーにSSHで接続し、タブ補完を使用してUnicode文字を含むファイル/フォルダーに移動すると、ファイル/フォルダーに問題なくアクセスできます。PHP経由でファイルにアクセスしようとすると問題が発生します(ファイルシステムにアクセスしていた関数は でしたstat
)。PHPスクリプトによって生成されたパスをブラウザに出力してターミナルに貼り付けると、ファイルも存在するように見えます(ターミナルを見てもファイルパスはまったく同じです)。
php_ini と set を介して、デフォルトのエンコーディングとして UTF8 を使用するように PHP を設定しましmb_internal_encoding
た。PHP ファイルパスの文字列エンコーディングを確認したところ、本来の UTF8 として出力されます。もう少し突っ込んhexdump
で、端末のタブ補完であるé文字を決定し、PHPスクリプトによって作成された「通常の」é文字と比較するhexdump
か、キーボードを介して文字を手動で入力します(option + e + e on os x)。結果は次のとおりです。
エコー -n é | 16進ダンプ 0000000 cc65 0081 0000003 エコー -n é | 16進ダンプ 0000000 a9c3 0000002
ターミナルで正しいファイル参照を可能にする é 文字は 3 バイトのものです。ここからどこへ行けばよいかわかりません。PHP ではどのエンコーディングを使用すればよいですか? またはを介してパスを別のエンコーディングに変換する必要がありますiconv
かmb_convert_encoding
?