2012-04-27 5 views
0

私は奇妙な問題があります。私の開発サーバー上ではすべてのものが動作しますが、ライブサーバーでは動作しません。私はそれに "ö"のような特殊な文字を持つフォルダを持っています。PHP 'is_dir'は 'urldecode'と組み合わせてfalseですが、string valueと同じですかtrueですか?

if (is_dir(urldecode($dir))) 
    echo "true"; 
else { 
    echo "false"; 
} 

結果が真である:開発サーバに私は、ファイル名がディレクトリ($ DIRが=「coördinatie」)であるかどうかを確認するために、これを行います。ライブサーバーでは、結果はfalseです。奇妙なことは...ハードコードされた文字列がうまく動作し、結果が真であることです。このように:

文字列に型キャストしようとしましたが、私はそれを理解できません。誰かが手がかりを持ちたいと思っています。

+2

ハードコード化されたファイルのエンコーディング(文字列を定義するPHPソースファイル)を確認し、開発サーバーとライブサーバーのファイルシステムに使用されているエンコーディングについて教えてください。 **両方の環境は同じように設定されていますか?** – hakre

答えて

2

私の推測では、これを次のようになります。

urldecodeは、一般的にUTF-8にデコードします。
ハードコードされた文字列は、ソースコードがそのまま保存されているため、Latin-1である可能性があります。
ローカルマシン上のファイルシステム(関数)は、Unicodeのように、Latin-1のようなものです。

文字列を、ファイルシステムが想定しているエンコーディングに変換する必要があります。
両方の文字列の値をbin2hexと比較することで疑いを確認できます。

+0

'urldecode'はPHPのバイナリセーフな関数であり、エンコードには依存せず、常にUTF-8ではなくバイナリ8ビットを1オクテットとしてデコードします。 – hakre

+0

@hakre実際、URLエンコードされた値は通常UTF-8エンコードされているはずです。 – deceze

+0

BIN2HEX文字列の値と、ハードコード値は確かに異なります 4943542d436ff67264696e61746f72 4943542d436fc3b67264696e61746f72 私は本当に正しい方法で文字列を変換すると、ファイルシステムのエンコーディングを探す方法がわからないか見当もつかない。 –

関連する問題