Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP] file_exists, rename i polskie znaki
Regss
post
Post #1





Grupa: Zarejestrowani
Postów: 60
Pomógł: 0
Dołączył: 7.05.2006

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 7)
croc
post
Post #2





Grupa: Zarejestrowani
Postów: 706
Pomógł: 108
Dołączył: 12.03.2010

Ostrzeżenie: (0%)
-----


Przepuść nazwę pliku przez utf8_decode (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
Regss
post
Post #3





Grupa: Zarejestrowani
Postów: 60
Pomógł: 0
Dołączył: 7.05.2006

Ostrzeżenie: (0%)
-----


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?

Ten post edytował Regss 4.12.2011, 17:40:27
Go to the top of the page
+Quote Post
Morfi777
post
Post #4





Grupa: Zarejestrowani
Postów: 76
Pomógł: 1
Dołączył: 5.09.2007

Ostrzeżenie: (0%)
-----


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


Nie (IMG:style_emoticons/default/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 ? (IMG:style_emoticons/default/biggrin.gif)
Go to the top of the page
+Quote Post
Regss
post
Post #5





Grupa: Zarejestrowani
Postów: 60
Pomógł: 0
Dołączył: 7.05.2006

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
Morfi777
post
Post #6





Grupa: Zarejestrowani
Postów: 76
Pomógł: 1
Dołączył: 5.09.2007

Ostrzeżenie: (0%)
-----


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)?
Go to the top of the page
+Quote Post
Regss
post
Post #7





Grupa: Zarejestrowani
Postów: 60
Pomógł: 0
Dołączył: 7.05.2006

Ostrzeżenie: (0%)
-----


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.

Ten post edytował Regss 6.12.2011, 10:11:43
Go to the top of the page
+Quote Post
-seorin-
post
Post #8





Goście







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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 18.09.2025 - 23:53