在OS X(PHP5.2.11)我有一个文件:siësta.doc (及其他与Unicode的文件)与我想转换的文件名为网络的消耗格式(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_功能。但是,这只是变得更糟。我做错了什么?

在此先感谢

有帮助吗?

解决方案

有趣的。后一位recherche我发现OS x储存的文件名为"分解unicode"(见 http://developer.apple.com/mac/library/qa/qa2001/qa1173.html).这是"e"表示的是作为"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
  }
?>

问题是窗口和PHP之间的通信。 It's没有可能得到Unicode文件名,因为它们依赖于非Unicode Windows应用程序的语言。

最好的解决办法是执行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

然后,你可以阅读myinfo.txt得到原来的名称和Windows短名称之间的连接。

一些PHP函数正常工作与短名称,你可以建立和数组,如果你需要显示它:

$array['short_name']= $original_name;

例如:is_dir, is_file正常工作即可。然而,scandiris_readable失败,短名称太即可。使用这些功能的解决方案是重新运行递归DIR命令。

要得到txt文件的信息,您可以使用正则表达式或SUBSTR,丢弃前五行和最后两个。例如:

for($k=6;$k<(count($array)-2);$k++) ...
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top