1

OS-X (PHP5.2.11) には、siësta.doc (および Unicode ファイル名を持つ他の千のファイル) というファイルがあり、ファイル名を Web で使用できる形式 (a-zA-Z0-9.) に変換したいと考えています。上記のファイル名をハードコーディングすると、正しい変換を行うことができます。

<?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_ 関数も試しました。しかし、それはただもっとひどかった。私は何を間違えましたか?

前もって感謝します

4

3 に答える 3

2

面白い。少し調べてみたところ、OSX はファイル名を「分解された Unicode」として保存することがわかりました ( http://developer.apple.com/mac/library/qa/qa2001/qa1173.htmlを参照)。つまり、「ë」は「e」+ダイアレシス記号 (0xcc88) として表されます。

于 2010-03-15T14:15:35.643 に答える
0

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
  }
?>
于 2010-03-15T14:12:45.743 に答える
0

問題は、windows と php の間の通信です。非ユニコードの Windows アプリケーション言語に依存しているため、ユニコードのファイル名を取得することはできません。

最良の解決策は、dir コマンドを実行して処理する情報を取得することですが、cmd を使用して Windows の短い名前を取得する必要があります。

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

次に、myinfo.txt を読み取って、元の名前と Windows の短い名前の間の接続を取得できます。

一部の PHP 関数は短い名前でも問題なく動作し、表示する必要があるかのようにビルドして配列することができます。

$array['short_name']= $original_name;

例:正常にis_dir, is_file 動作します。ただし、scandirまたはis_readable 短い名前でも失敗します。これらの関数を使用する解決策は、dir コマンドを再帰的に再実行することです。

txt ファイルから情報を取得するには、正規表現または substr を使用して、最初の 5 行と最後の 2 行を破棄します。例えば:

for($k=6;$k<(count($array)-2);$k++) ...
于 2015-12-22T21:28:18.460 に答える