web-dev-qa-db-ja.com

ファイル名のエンコードの問題

ファロ名のファイルを取得して、PHPスクリプトに保存しようとしています。

2010_08_Útflutningur.xls

Ubuntu 10.04では、LTSは次のように保存しています:

2010_08_�tflutningur.xls (invalid encoding)

utf8-migration-toolをインストールして実行しましたが、効果はありません。

これはUbuntuのエラーですか?修正できますか、それともPHPの名前を放棄して変更する必要がありますか?

Ubuntuのファイル名に受け入れられる文字セットは何か、またはエンコーディング仕様は何ですかを記載したドキュメントはありますか?

ありがとう

9
Elzo Valugi

これはエンコードの問題のようです。残念ながら、PHPはデフォルトではシングルバイト文字列であるため、エンコーディングに関しては少し手で保持する必要があります。 PHP内でファイル名を作成する場合、 utf8_encode() が役立つはずです。ただし、入力にはISO-8859-1エンコードを想定していることに注意してください。

一方、クライアントから送信されたファイル名を使用している場合は、おそらくクライアントにエンコードを依頼することができます。これは、accept-charsetタグの <form> 属性を使用して、および/またはフォームが存在するページの文字セットを設定することによって行われます。特定のクライアントはどちらか一方を使用する場合があるため、最良の結果を得るには、それぞれにUTF-8を使用します。

5
eswald

デフォルトでは、Ubuntuはファイル名にUTF-8を使用します。最近のほとんどのLinuxディストリビューションおよび他の多くのオペレーティングシステムは、これを行います(Windows/NTFSは、UTF-16で最もよく知られている例外です)。

表示されているような間違ったエンコーディングの名前を持つファイルを修正するには、nautilus-filename-repairerを使用してみてください。

Sudo apt-get install nautilus-filename-repairer

PHP iconv 関数を使用して、文字列(ファイル名)をあるエンコーディングから別のエンコーディングに変換できます。もちろん、そのためには、最初にどのエンコーディングを使用しているかを知っている必要があります。

クライアントから正しくエンコードされたファイル名を取得するには、eswaldで説明されている手法を試すことができます。

7
JanC