7

$filenameウムラウトが含まれている場合(ä、ö、ü)file_get_contents($filename)は、私のWindowsOSでは機能しません。試行錯誤の結果、それを機能させるためにやらなければならないことがわかりましたfile_get_contents(utf8_decode($filename))

しかし、これをライブでサーバーにプッシュすると(Linuxの一種だと思います)、再びエラーが返されました。そのため、を削除するutf8_decodeと、突然完全に機能しました。

回避策として(コードを変更するたびにこのコードを手動で変更する必要がないため)、すでに試しました

(mb_detect_encoding($filename, 'UTF-8', true)) ? utf8_decode$filename) : $filename;

これは逆に同じ問題ですでに機能していましたが(と同じ問題がありましたutf8_encode)、$filenameすべての(サーバー)環境でUTF8でエンコードされていることが判明したため、これは常に当てはまるため、機能しません。

これを両方のシステムで機能させる方法はありますか?(「PHP開発のためにLinuxに移行するだけ」ではありません。Linuxを使用していますが、ATMはさまざまな理由でWindowsを使用しています)


編集:問題はでも表示されfopen、受け入れられた解決策も同様に機能します。

4

2 に答える 2

3

最善の方法は、Windowsサーバーを使用しているかどうかを検出することです。それからあなたは正しいコマンドを適用することができます

if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
    echo 'This is a server using Windows!';
} else {
    echo 'This is a server not using Windows!';
}
于 2013-02-24T19:14:50.010 に答える
3

問題は、ファイル名またはディレクトリ名にUTF-8をサポートしていないウィンドウファイルシステムですが、Linuxはphp 6でUTF-8をサポートしています。この問題は解決しました。現在のバージョンのphpでこの問題を解決するには、次のような作業を行うことができます。

1)ウィンドウサポートUTF-16とLinuxはこの種のUnicodeに問題はなく、すべてのファイル名とディレクトリ名をこのUnicodeに保存できます

2) UTF-8をエンコードするurlencode 。これは、この問題を解決するためのもう1つの方法です。これを使用することをお勧めします。

この問題を解決するためにこのスクリプトを作成し、テストしました。

 function GetExt($sFileName)//ffilter
 {
     $sExt="";
     $sTmp=$sFileName;
     while($sTmp!="")
     {
        $sTmp=strstr($sTmp,".");
        if($sTmp!="")
        {
            $sTmp=substr($sTmp,1);
            $sExt=$sTmp;
        }
     }
     return ($sExt);
 }
  function LocatePath($Path='/',$Mode="rb",$Root="",$Open=true,$IsFile=false){//make real Path and create new Directory
     switch(strtolower($Mode)){
          case 'r':
            $Read=true;
            $Write=false;
            $Create=false;
          break;
          case 'rb'://Open for reading only; place the file pointer at the beginning of the file. 
            $Read=true;
            $Write=false;
            $Create=false;
          break;
          case 'r+'://Open for reading and writing; place the file pointer at the beginning of the file.
            $Read=true;
            $Write=true;
            $Create=false;
          break;
          case 'x'://Create and open for writing only; place the file pointer at the beginning of the file. If the file already exists, the open() call will fail by returning FALSE
            $Read=false;
            $Write=true;
            $Create=false;
          break;
          case 'wb':
            $Read=false;
            $Write=true;
            $Create=true;
          break;
          case 'ab':
            $Read=false;
            $Write=true;
            $Create=true;
          break;
          case 'w'://Open for writing only; place the file pointer at the beginning of the file and truncate the file to zero length. If the file does not exist, attempt to create it. 
            $Read=false;
            $Write=true;
            $Create=true;
          break;
          case 'w+'://Open for reading and writing; place the file pointer at the beginning of the file and truncate the file to zero length. If the file does not exist, attempt to create it. 
            $Read=true;
            $Write=true;
            $Create=true;
          break;
          case 'a'://Open for writing only; place the file pointer at the end of the file. If the file does not exist, attempt to create it. 
            $Read=false;
            $Write=true;
            $Create=true;
          break;
          case 'a+'://Open for reading and writing; place the file pointer at the end of the file. If the file does not exist, attempt to create it. 
            $Read=true;
            $Write=true;
            $Create=true;
          break;
          case 'x+'://Create and open for reading and writing; otherwise it has the same behavior as 'x'. 
            $Read=true;
            $Write=true;
            $Create=true;
          break;
          case 'c'://Open the file for writing only. If the file does not exist, it is created. If it exists, it is neither truncated (as opposed to 'w'), nor the call to this function fails (as is the case with 'x'). The file pointer is positioned on the beginning of the file.
            $Read=false;
            $Write=true;
            $Create=true;
          break;
          case 'c+'://Open the file for reading and writing; otherwise it has the same behavior as 'c'. 
            $Read=true;
            $Write=true;
            $Create=true;            
     }
     $Path=str_replace("./",'/',trim($Path));
     $Path=str_replace("../",'/',$Path);
     $Path=str_replace(".../",'/',$Path);
     $Path=ltrim($Path,'/');
     if($Path==NULL or $Path=="")$Path="/";
     $DOCUMENT_ROOT=$_SERVER['DOCUMENT_ROOT'];
     $FileRoot=$DOCUMENT_ROOT."/".$Root;
     $FileRoot=str_replace("\\",'/',$FileRoot);
     $FileRoot=rtrim(str_replace('//','/',$FileRoot),'/');
     $TMkDir=0;
     $ISDir=true;
     $RelativePath=$Path;
     $Type=GetExt($FileRoot."/".$Path);
     if($Type!=""){
         $FileName=basename($FileRoot."/".$Path);
     }
     $ParentDir=dirname($Path);
     $T=urlencode($FileRoot."/".$Path);
     $T=str_replace("%3A",':',$T);
     $T=str_replace("%2F",'/',$T);
     if(is_file($T)){
         if($IsFile){
             return array("ISDir"=>false,"Handle"=>false,"Path"=>$T,'FileName'=>$FileName,"Type"=>$Type,"RelativePath"=>$RelativePath,'ParentDir'=>$ParentDir,'Read'=>$Read,'Write'=>$Write);
         }
         $Handle=fopen($T,$Mode);
         return array("ISDir"=>false,"Handle"=>$Handle,"Path"=>$T,'FileName'=>$FileName,"Type"=>$Type,"RelativePath"=>$RelativePath,'ParentDir'=>$ParentDir,'Read'=>$Read,'Write'=>$Write);
     }
     if(is_dir($T)){
         return array("ISDir"=>true,"Handle"=>NULL,"Path"=>$T,"RelativePath"=>$RelativePath,'ParentDir'=>$ParentDir,'Read'=>$Read,'Write'=>$Write);
     }
     $PathSplit=explode("/",$Path);
     if($Create==true){
         try{
            foreach($PathSplit as $PartDir){
               $TPartDir=$PartDir;
               $PartDir=urlencode($PartDir);
               $Temp=$FileRoot."/".$PartDir;
               if(!is_file($Temp) and $TPartDir!=$FileName){
                  if(!is_dir($Temp)){
                     mkdir($Temp);
                  }
               }else{
                   $ISDir=false;
                   $Temp=$FileRoot."/".$FileName;
                   $Handle=fopen($Temp,$Mode);
                   $FileRoot=$FileRoot."/".$PartDir;    
                   break;
               }
               $FileRoot=$FileRoot."/".$PartDir;    

            }
         }catch(Extension $e){
             echo ($e);
             return false;
         }
     }else{
         try{
            foreach($PathSplit as $PartDir){
               $TPartDir=$PartDir;
               $PartDir=urlencode($PartDir);
               $Temp=$FileRoot."/".$PartDir;
               if(!is_file($Temp) and $TPartDir!=$FileName){
                  if(!is_dir($Temp)){
                     return false;
                  }
               }else{
                   $ISDir=false;
                   $Handle=fopen($Temp,$Mode);
                   $FileRoot=$FileRoot."/".$PartDir;    
                   break;
               }
               $FileRoot=$FileRoot."/".$PartDir;    
            }
         }catch(Extension $e){
             echo ($e);
             return false;
         } 
     }
     if($Open!=true){//keep open Handle for User
        fclose($Handle); 
     }
     return array("ISDir"=>$ISDir,"Handle"=>$Handle,"Path"=>$FileRoot,'FileName'=>$FileName,"Type"=>$Type,"Create"=>(!$ISDir)?true:false,"RelativePath"=>$RelativePath,'ParentDir'=>$ParentDir,'Read'=>$Read,'Write'=>$Write);
 }

サンプル:

書き込み用にファイルを開き、ディレクトリまたはファイルが存在しない場合は読み取りて作成します。1)

 print_r(LocatePath('/er/ert/aیgfسبd/ی.af',"w+")); 

fopenのハンドルなどの情報を返します

出力

Array
(
[ISDir] => 
[Handle] => Resource id #3
[Path] => F:/xampp/htdocs/er/ert/a%DB%8Cgf%D8%B3%D8%A8d/%DB%8C.af
[FileName] => ی.af
[Type] => af
[Create] => 1
[RelativePath] => er/ert/aیgfسبd/ی.af
[ParentDir] => er/ert/aیgfسبd
[Read] => 1
[Write] => 1
)

2)存在しない場合は読み取り用にファイルを開き、falseを返します

 print_r(LocatePath('/er/ert/aیgfسبd/ی.af',"rb")); 

とfopenと同じいくつかの別のモード

于 2013-02-24T19:48:27.650 に答える