Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] file_exists, rename i polskie znaki
Forum PHP.pl > Forum > Przedszkole
Regss
Witam!
Mam taki skrypt:
  1. <?PHP
  2. echo '<img src="ó.jpg">';
  3. if (file_exists("ó.jpg")) {
  4. echo 'ok';
  5. } else {
  6. echo 'no';
  7. }
  8. rename("ó.jpg", "1.jpg");
  9. ?>


Kodowanie wszędzie ustawione na UTF-8 obrazek wyświetla się prawidłowo jednak file_exist() i rename() nie widzi tego pliku. Jest to mi potrzebne do zmiany nazw w większej ilości plików. W nazwach mogę znaleźć się nie tylko polskie litery ale też litery innych krajów.
croc
Przepuść nazwę pliku przez utf8_decode smile.gif
Regss
Zrobiłem tak:

  1. rename(utf8_decode ("ó.jpg"), "1.jpg");


I zadziałało. Jednak akurat działa tylko na literze "ó" po wpisaniu:

  1. rename(utf8_decode ("źćń.jpg"), "1.jpg");


Już nie działa.
Serwer mam na localhoście pod windows'em może w tym jest problem?

Czy naprawdę nie ma dobrego uniwersalnego sposobu na zmianę nazwy?
Morfi777
Cytat(Regss @ 5.12.2011, 16:47:27 ) *
Czy naprawdę nie ma dobrego uniwersalnego sposobu na zmianę nazwy?


Nie smile.gif

Dlatego, że windows do kodowania polskich nazw plików używa `windows-1250`

wg php: http://se2.php.net/manual/en/mbstring.supp...d-encodings.php
Wspierają jedynie 1251 oraz 1252. Podobno iconv wspiera konwertowanie do 1250, ale nie wiem z jakim powodzeniem, na pewno nie w domyśle, trzeba mu te bibliotekę dograć.

Polskie znaki + Windows, mógło być gorsze połączenie ? biggrin.gif
Regss
Ehh.. już nie chodzi o ten windows bo chyba 99,9% serwerów hostingowych stoi na linuxie/unixie ale problem w tym, że nawet na takim serwerze nie mogę sobie poradzić.
Niestety potrzebuję tego dlatego, iż użytkownicy mojego skryptu będą dostarczać do niego dane w postaci plików wyeksportowanych automatycznie z całkiem innego programu w postaci "tytuł.jpg" a zmianą nazw ma się zająć sam skrypt.

Wymyśliłem coś takiego jednak nie wiem jakie to będzie miało skutki na razie działa prawidłowo na kilku europejskich językach.

  1. <?php
  2. header('Content-Type: text/html; charset=utf-8');
  3. $handle = opendir('test/');
  4. /* This is the correct way to loop over the directory. */
  5. while (false !== ($file = readdir($handle))) {
  6. if ($file != "." && $file != "..") {
  7. echo $file . mb_detect_encoding($file, 'UTF-8, ISO-8859-1, ISO-8859-2') . '<br>';
  8. echo iconv('windows-1250', 'UTF-8', $file) . '<br>';
  9. }
  10. }
  11.  
  12. ?>


Tylko czemu funkcja mb_detect_encoding() nie zwraca poprawnie kodowania przecież powinna zwrócić windows-1250 a zwraca ISO-8859-1?
Morfi777
Nie wiem dlaczego wykrył ISO, być może dlatego, że dałeś mu tylko 3 opcje, a ta była mu najbliższa chociaż to absurd bo polska ma -2, a nie -1.

Widzę, że listujesz te pliki, po przekonwertowaniu wyświetlają się prawidłowo (bez krzaczków)?
Regss
Po przekonwertowaniu z windows-1250 na utf-8 znaki wyświetlane są prawidłowo bez krzaków. Próbując konwertować z niby wykrytego ISO-8859-1 wychodzą krzaki. Żeby zmienić nazwę pliku lub żeby file_exists zwróciło true robię tak:
  1. <?php
  2. $file = 'źżćń.txt';
  3. if (file_exists(iconv('utf-8', 'windows-1250', $file))) {
  4. echo 'ok';
  5. } else {
  6. echo 'error';
  7. }
  8. ?>


Najlepsze, że działa to na serwerach unixowych. Tylko przydało by się prawidłowo wykrywać kodowanie aby skrypt uczynić bardziej uniwersalnym.
seorin
Witam,
Ciekaw jest czy znalazł ktoś może rozwiązanie na ten temat?

Gdyż mam ten sam problem.
Otóż próbowałem już robić to na localhoscie i na windowsie i na ubuntu i mam ten sam problem wszędzie.

Pomyślałem że zrobię coś takiego:

  1. if($extension==$this->lang["dir"] || $extension==$this->lang["noExtension"])
  2.  
  3. {
  4. if(mb_detect_encoding($file)=='UTF-8'){
  5. $nazwa=iconv('', mb_detect_encoding($file),$directory);
  6. $nazwa2=$this->remove_pl($directory, 'utf8');}
  7. else{
  8. $nazwa=iconv('', mb_detect_encoding($file),$directory);
  9. $nazwa2=$this->remove_pl($nazwa, 'latin2');}
  10. rename($nazwa,$nazwa2);
  11.  
  12. }
  13.  
  14. else{
  15. if(mb_detect_encoding($file)=='UTF-8'){
  16. $nazwa=iconv('', mb_detect_encoding($file),$directory);
  17. $nazwa2=$this->remove_pl($directory, 'utf8');}
  18. else{
  19. $nazwa=iconv('', mb_detect_encoding($file),$directory);
  20. $nazwa2=$this->remove_pl($nazwa, 'latin2');}
  21.  
  22. rename($nazwa,$nazwa2);
  23.  
  24. }

Szybkie objaśnienie:
Funkcja remove_pl() usuwa polskie znaki z nazwy.

Co zauważyłem:
O ile na windzie standardowo nic nie chodziło to na ubuntu ma problem jedynie z niekturymi plikami z kodowanie UTF-8, wszystkie te z rozszerzeniem ASCII idą bez problemu.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.