2009-06-10 11 views
7

たとえば、私はこのようなファイル名を持っています - проба.xmlと私はPHPスクリプトから開くことができません。名前にUnicode文字を含むファイルをPHPで開くには?

私はのfile_get_contentsにこれを渡すときにスクリプト内のすべてのテキストよりもUTF-8にあるように、私のセットアップのPHPスクリプトは、このようにUTF-8の場合:

$fname = "проба.xml"; 
file_get_contents($fname); 

私は、ファイルが存在しないというエラーが出ます。これは、Windows(XP)では非ラテン文字のファイル名がすべてUnicode(UTF-16)であるためです。

任意の提案...

$fname = "проба.xml"; 
$res = mb_convert_encoding($fname,'UTF-8','UTF-16'); 
file_get_contents($res); 

しかし、のfile_get_contentsは、Unicode文字列を受け入れることができないので、エラーが解消されない:OKので、私はこれを試してみましたか?

+0

このコードは現在のものですか? file_get_contentsに$ fnameと$ resを入れ替えていないのですか? – ryanday

+0

これは私のタイプミスです。私は実際に値を切り替えました。 –

+0

私は私のXPシステムに乗ってあなたのコードを試しました。私はユニコードでPHPファイルを保存し、あなたが書いたものをコピー/貼り付け、ファイルを読むことができます(同じファイル名)。あなたのソースファイルはどのようなエンコードに保存されていますか? – ryanday

答えて

0

これらは、これまでの結論です:

  1. PHP 5は、Unicode文字とのオープンファイル名ことはできませんソースファイル名がUnicodeでない限り。
  2. PHP 5(少なくともWindows XPの場合)は、PHPソースをユニコードで処理することができません。

は、このようにPHP 5

+0

PHPはすべての文字がWindowsインストールのデフォルトコードページにある場合にのみ、非ASCII文字でファイル名を開くことができます。非ASCII文字を含む文字列リテラルを扱うことができます。ダイレクトバイトを使用するだけなので、テキストエディタでどのようにソースファイルを保存したエンコーディングに依存するのでしょうか。多くのWindowsテキストエディタが「Unicode」と不正確に呼んでいるエンコーディングは、実際にはUTF-16LEです。非ASCII互換であるため、PHPは処理できません。背景については、[この質問](http://stackoverflow.com/q/482342/18936)を参照してください。 – bobince

0

あなたは試みることができる:

  • はopendir関数を使用してディレクトリ一覧からファイル名の文字列を取得し、それが動作するかどうかを確認するために_contentsをfile_getし、その文字列を渡す
  • をのreaddir、または
  • なってみてくださいfopen、fread、fcloseを使用したファイルの内容

これは役に立ちます。

+0

これがどのように機能するかを示すコード例を含めることができますか? –

8

UPDATEでこのなんとかない結論は

ドキュメントはそれを言及していないようですが(7月13日'17)は、PHP 7.0の上には、最終的には、ファイル名にUnicodeをサポートしていますWindowsはすぐに使用できます。 PHPのファイルシステムAPIは、default_charset(デフォルトではUTF-8)に従ってファイル名を受け入れて返します。

ここで修正するバグを参照してください:https://github.com/php/php-src/commit/3d3f11ede4cc7c83d64cc5edaae7c29ce9c6986f


UPDATE(1月29日'15)

あなたがPHP拡張ディレクトリへのアクセス権を持っている場合、あなたはhttps://github.com/kenjiuno/php-wfiophp-wfio.dllをインストールしてみてください、とを参照することができますファイルをwfio://プロトコル経由で送信します。 Windows上の

file_get_contents("wfio://你好.xml"); 

オリジナル回答

PHPは、排他的にPHPが代わりにユニコードのシステムロケールを使用することを意味しますローカルファイルへのアクセスのためのレガシー "ANSI APIを" 使用しています。

ファイル名にUnicodeが含まれているファイルにアクセスするには、ファイル名を現在のシステムロケールの指定されたエンコードに変換する必要があります。 ファイル名に指定されたエンコーディングで表現できない文字が含まれている場合は、(更新については上のセクションを参照してください)です。 scandirは、これらのファイルに対して不安定な結果を返し、fopenに文字列を戻し、同等のものは失敗します。

使用する権利エンコーディングを見つけるには、<?=setlocale(LC_TYPE,0)?>を呼び出し、およびMSDNの記事https://msdn.microsoft.com/en-us/library/dd317756(VS.85).aspxコードページ識別子.後の番号)を調べることにより、システムのロケールを取得することができます。

たとえば、関数がChinese (Traditional)_HKG.950を返した場合、これは950コードページが使用されており、ファイル名をbig-5エンコーディングに変換する必要があることを意味します。その場合は、あなたのコードは、あなたのファイルが(できれBOMなし)UTF-8で保存されている場合、以下のようになります:

$fname = iconv('UTF-8','big-5',"你好.xml"); 
file_get_contents($fname); 

か、直接ビッグ-5として、ファイルを保存する場合は、次のように:

$fname = "你好.xml"; 
file_get_contents($fname); 
+0

このアップデートをお寄せいただきありがとうございます。 –

+0

こんにちは、ファイル名がUTF-8である.zipファイルを抽出する方法を教えてください。 –