質問

OS-X(PHP5.2.11)いファイル:siësta.doc (千その他のUnicodeファイル名)として変換したいファイルの名前をウェブ上の消耗形式(a-zA-Z0-9.).まhardcodeのファイル名上記の権利変換:

<?php
  $file = 'siësta.doc';
  echo preg_replace("/[^a-zA-Z0-9.]/u", '_', $file);
  // Output: si_sta.doc
?>

だいファイルの読み込み名scandirたい変換:

<?php
  $files = scandir(DIRNAME);
  foreach ($files as $file) {
    echo preg_replace("/[^a-zA-Z0-9.]/u", '_', $file);
    // Output for the file above: sie_sta.doc
  }
?>

って検出するエンコード、エンコーディングを設定する変換がiconvます。またmb_機能もございますものでした。あどけないのは間違いだったのか?

かまいません。

役に立ちましたか?

解決

興味深い。後のビットrecherchéいOSXファイル名店としての"分解unicode"を参照 http://developer.apple.com/mac/library/qa/qa2001/qa1173.html).それは、"ú"の代表的なものである"e"+diaresisシンボルマーク(0xcc88).

他のヒント

あなたははutf8_encodeを試してみたのですか? (少なくとも、Windows上で動作します)。

<?php
  $files = scandir(DIRNAME);
  foreach ($files as $file) {
    echo preg_replace("/[^a-zA-Z0-9.]/u", '_', utf8_encode($file));
    // Output for the file above: sie_sta.doc
  }
?>

問題は、WindowsとPHPの間の通信です。彼らは非UnicodeのWindowsアプリケーション言語に依存しているためIt'sノー可能で、Unicodeのファイル名を取得します。

最善の解決策は、処理するdirコマンドを実行し、情報を取得することですが、あなたはCMDを通じてので、それをしなければならない、と窓短い名前を取得します:

chcp 65001
dir /x c:\test\ > myinfo.txt

それを返します:

 El volumen de la unidad C es Windows8_OS
 El número de serie del volumen es: 14A3-025F

 Directorio de C:\test

22/12/2015  22:11    <DIR>                       .
22/12/2015  22:11    <DIR>                       ..
22/12/2015  22:12                 0              a.txt
22/12/2015  22:10    <DIR>                       English
22/12/2015  22:10    <DIR>          ESPAOL~1     Español
22/12/2015  22:11    <DIR>          8311~1       ру́сский язы́к
22/12/2015  22:10    <DIR>          _0B41~1      عربي ,عربى
22/12/2015  22:10    <DIR>          8F4C~1       北方話
               1 archivos              0 bytes
               7 dirs  839.672.786.944 bytes libres

次に、あなたは元の名前とWindowsの短い名前との間の接続を取得するためにmyinfo.txtを読むことができます。

いくつかのPHP関数は、短い名前で正常に動作し、あなたがそれを表示する必要があるかのように構築して配列することができます:

$array['short_name']= $original_name;

例:is_dir, is_file正常に動作しますの。しかし、scandirまたはis_readableはあまりにもの短い名前で失敗します。これらの関数を使用するためのソリューションは、再帰的にdirコマンドを再実行することです。

txtファイルから情報を取得するには、最初の5行と最後の2を捨て、正規表現またはSUBSTRを使用することができます。たとえばます:

for($k=6;$k<(count($array)-2);$k++) ...
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top