2010-03-15 4 views
0

OS-X (PHP5.2.11)의 경우 siësta.doc (및 기타 1000 개의 유니 코드 파일 이름) 파일이 있고 웹 사이트 소모품 형식 (a-zA-Z0-9).preg_replace() 및 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 
    } 
?> 

나는를 감지하는 시도 : 나는 파일 이름을 하드 코딩하면 내가 바로 변환 할 수있는 위 :

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

을하지만 위해 scandir와 파일 이름을 읽는다면, 나는 이상한 변환있어 인코딩, 인코딩 설정, iconv 함수로 변환. 나는 mb_ 함수도 시도했다. 그러나 그것은 더 나빴습니다. 내가 뭘 잘못 했니?

미리 감사드립니다.

답변

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 
    } 
?> 
+0

안녕하세요. 예, 앞뒤로 시도했지만 작동하지 않았습니다. 어쨌든 고마워;) – itarato

0

문제는 windows와 php 사이의 통신입니다. 유니 코드가 아닌 파일 이름을 사용하기 때문에 유니 코드 파일 이름을 가져올 수 없습니다.

가장 좋은 방법은 처리 할 수있는 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를 읽어서 원래 이름과 창 간의 짧은 이름 연결을 가져올 수 있습니다.

일부 PHP 함수는 짧은 이름으로 잘 작동하고 당신이 그것을 표시 할 필요 것처럼 구축하고 배열 할 수 있습니다 : 예를 들어

$array['short_name']= $original_name; 

: is_dir, is_file 잘 작동합니다. 그러나 scandir 또는 is_readable도 짧은 이름으로도 실패합니다. 이 함수를 사용하는 솔루션은 dir 명령을 재귀 적으로 다시 실행하는 것입니다.

txt 파일에서 정보를 얻으려면 정규식 또는 substr을 사용하여 첫 번째 5 줄과 마지막 두 줄을 버립니다. 예 :

for($k=6;$k<(count($array)-2);$k++) ...