2015-07-05 9 views
13

Używam klasy PHP ZipArchive do wypakowania pliku .zip, działa dobrze dla języka angielskiego, ale powoduje problemy w moim lokalnym języku (THAI).Błąd podczas zmiany nazwy rozpakowanego pliku zip na inne języki W PHP

Używam icov('utf-8','windows-874',$zip->getNameIndex($i)) do konwersji UTF-8 na THAI. To działa na nazwę folderu/pliku, ale nie działa dla wyodrębnionego pliku .zip i powodować ten błąd:

iconv(): Wykryto niedozwolony znak w ciągu wejściowego

Może ktoś proszę powiedzieć mi jaki jest problem?

Mój kod PHP

$file = iconv('utf-8', 'windows-874', $_GET['File']); 
$path = iconv('utf-8', 'windows-874', $_GET['Path']); 

$zip = new ZipArchive; 
if ($zip->open($file) === TRUE) { 
    // convert to Thai language 
    for($i = 0; $i < $zip->numFiles; $i++) { 
     $name = $zip->getNameIndex($i); 
     //echo iconv("charset zip file", "windows-874", $name); 
     //$zip->extractTo($path,$name); -> this problem 
    } 
    $zip->close(); 
    echo json_encode('unZip!!!'); 
} else { 
    echo json_encode('Failed'); 
} 

Po wyodrębnić plik zip, nazwa pliku nie jest jeden ustawić dla niego. After I extract the zipped file, The file's name is not the one I set for it.

Jest to nazwa próbuję ustawić: This is name i try to set :

Oto moja spakowany plik:

https://www.dropbox.com/s/9f4j04lkvsyuy63/test.zip?dl=0

UPDATE
próbowałem rozpakować plik w systemie Windows XP, to działa dobrze ale nie w Windows 7.

+0

Nikt nie może powiedzieć, chyba że pokazujesz, co zawiera łańcuch. (Pliki ZIP w rzeczywistości nie są znane z obsługi Unicode Większość narzędzi używa tylko lokalnych zestawów znaków asis.) – mario

+1

Gdzie jest kod, którego używasz do rzeczywistego wyodrębniania treści? Czy możesz przesłać minimalny przykład pliku zip, który gdzieś podaje błąd (po dodaniu kodu, którego używasz do wyodrębnienia jego zawartości)? – MatsLindh

+2

, ale nie jest lepiej pracować "THAI" z 'utf8' tak czy inaczej? Jaka jest potrzeba przekonwertowania go na 'windows-874'? –

Odpowiedz

1

Prawdopodobnie powinieneś spróbować mb_detect_encoding(), aby uzyskać pomoc - zobacz poniższy kod. Być może będziesz musiał rozwinąć ten kod, jeśli masz problem ze swoją ścieżką. Po prostu użyj pętli, jeśli musisz to zrobić.

$file = iconv('utf-8', 'windows-874', $_GET['File']); 
$path = iconv('utf-8', 'windows-874', $_GET['Path']); 

$zip = new ZipArchive; 
if ($zip->open($file) === TRUE) { 
    // convert to Thai language 
    for($i = 0; $i < $zip->numFiles; $i++) { 
     $name = $zip->getNameIndex($i); 
     $order = mb_detect_order(); 
     $encoding = mb_detect_encoding($name, $order, true); 
     if (FALSE === $encoding) { 
      throw new UnexpectedValueException(
       sprintf(
        'Unable to detect input encoding with mb_detect_encoding, order was: %s' 
       , print_r($order, true) 
       ) 
      ); 
     } else { 
      $encoding = mb_detect_encoding($name); 
      $stringUtf8 = iconv($encoding, 'UTF-8//IGNORE', $name); 
      $zip->extractTo($path,$stringUtf8); 
     } 
    } 
    $zip->close(); 
    echo json_encode('unZip!!!'); 
} else { 
    echo json_encode('Failed'); 
} 
+0

Dziękuję za Twój kod, ale nie działa i zmieniam się na angielski. To łatwiejsze niż tajlandzka nazwa pliku. Dziękuję Ci bardzo –

Powiązane problemy