Brak liter 'ś' oraz 'ą' w kodowaniu

0

Witam wszystkich, właśnie dołączyłem do forum celem rozwiązania tego problemu. Mam nadzieję, że mogę liczyć na Waszą pomoc także w przyszłości, choć problemów, z którymi nie można sobie poradzić oby było jak najmniej :)
W bazie danych przechowuję dane utworów (metoda porównywania "utf8_polish_ci"), same utwory znajdują się w folderze, z którego skrypty umożliwiają odsłuch i pobieranie. Wszystko było cacy, dopóki nie zorientowałem się, że program nie działa dla nazw, w których występują znaki 'ś' i 'ą'. Program wczytuje dane z bazy, przetwarza je na nazwę pliku (konkretny schemat nazewnictwa) i przekazuje dane do Widoku.

$path = iconv('UTF-8', 'ISO-8859-2', 'assets/download/'.$file); //$file to dokładna nazwa pliku
$size = filesize($path);

W przypadku wspomnianych dwóch liter funkcja filesize generuje jednak błąd "Warning: filesize(): stat failed for assets/download/nazwa pliku". Szukałem już wszystkiego, próbowałem różnych metod z innych wpisów, ale żaden przypadek nie trafia jednak w mój punkt.
Gdzie leży błąd w kodowaniu? Po stronie bazy danych czy złego przetworzenia tekstu przez skrypt?
Z góry dziękuję za pomoc, jeśli trzeba, śmiało podeślę inne fragmenty kodu czy potrzebne informacje.

1

Z mb_convert_encoding() masz to samo? Może dobrze by było wszędzie używać jednego kodowania, najlpiej UTF-8. Jesteś pewnie, że w bazie string ma właściwe znaki? Opisz jeszcze środowisko, czy to Linux, Okna, jakie bazy itd.

0

Probowalem również mb_convert_encoding() i innych sposobów, bez efektu. Kodowanie na UTF-8, z tego co pamiętam, również powodowało problemy, stąd użycie funkcji iconv(). Nie wiem więc na co konwertować, żeby było dobrze, a także nie rozumiem, czemu wszystkie znaki poza tymi dwoma są dobrze konwertowane. Dlaczego 'niepełny' zestaw znaków w ogóle ma miejsce? Nie jestem specem w sprawach kodowania, czy problem leży w bazie danych? Tam od początku ustawione było "utf8_polish_ci", a dane wprowadzałem manualnie przez PHPMyAdmin. Działam na Windows, wszystkie pliki są kodowane jako UTF-8 (bez BOM), choć często zmieniałem kodowanie w trakcie - może ktoś już korzystał z metody "wytnij treść > ustaw kodowanie i zapisz plik > wklej i zapisz" - kiedyś faktycznie działało, ale teraz niestety nie. Btw. baza danych to MariaDB.
Dodam, że te same nazwy, które skrypt źle konwertuje wyświetlają się normalnie z polskimi ogonkami w Widoku, problem występuje tylko w konwersji znaków tak, żeby filesize() 'było zadowolone'.

jurek1980 napisał(a):

Z mb_convert_encoding() masz to samo? Może dobrze by było wszędzie używać jednego kodowania, najlpiej UTF-8. Jesteś pewnie, że w bazie string ma właściwe znaki? Opisz jeszcze środowisko, czy to Linux, Okna, jakie bazy itd.

2

Trochę zgaduję, bo personalnie nie miałem podobnego problemu - raczej pliki staram się nazywać w ASCII. Windows koduje nazwy plików w UTF16, które jest kompatybilne z UTF-8.
Ty kodujesz nazwę do ISO8859-2. Spróbuj używać jednak UTF8.
Zobacz tu : https://stackoverflow.com/questions/15055192/why-does-windows-need-to-utf8-decode-filenames-for-file-get-contents-to-work mieli podobny problem.
Tu też http://blog.garr.co.uk/php/2015/09/22/php-windows-and-utf-8-filenames.html

0

Z tych wszystkich rozwiązań pozostaje mi jedynie pobranie i dołączenie czyjejś wtyczki WFIO.. Wolałbym jednak, tudzież mam nadzieję, na rozwiązanie tego problemu w inny sposób.
Może to będzie jakąś wskazówką? Sprawdzając kodowanie stringa funkcją mb_detect_encoding(), w surowej wersji daje wynik UTF-8, jednak po konwersji na ISO-8859-2 czy inny zwraca false lub ASCII. Naprawdę chciałbym ten problem rozwiązać u podstaw, skoro wielu innych programistów nie ma takiego problemu, znaczy, że jakaś konkretna przyczyna go wywołuje :/ Jak pogodzić ze sobą kodowanie PHP z kodowaniem plików przez Windows, że tak to określę?
Mógłbyś rozwinąć swoją wypowiedź co do kodowania plików w ASCII?

jurek1980 napisał(a):

Trochę zgaduję, bo personalnie nie miałem podobnego problemu - raczej pliki staram się nazywać w ASCII. Windows koduje nazwy plików w UTF16, które jest kompatybilne z UTF-8.
Ty kodujesz nazwę do ISO8859-2. Spróbuj używać jednak UTF8.
Zobacz tu : https://stackoverflow.com/questions/15055192/why-does-windows-need-to-utf8-decode-filenames-for-file-get-contents-to-work mieli podobny problem.
Tu też http://blog.garr.co.uk/php/2015/09/22/php-windows-and-utf-8-filenames.html

0

a może windows1250 ?
"NTFS stores file names in Unicode. In contrast, the older FAT12, FAT16, and FAT32 file systems use the OEM character set"
https://docs.microsoft.com/en-us/windows/desktop/intl/character-sets-used-in-file-names

1

Chodziło mi o to, że nie używam żadnych znaków specjalnych i staram się by nazwy plików zawierały tylko znaki z tabeli ASCI.
Co do kodowania to różnicą między ISO-8859-2 i ISO-8859-1 jest właśnie brak ą i ś i ź. Może jednak gdzieś to kodowanie się rozjeżdża.Sprawdź może jeszcze raz wszystko po kolei wraz z kodowaniem plików w jakich trzymasz skrypt.

0

Szczerze to nie powinno sie stosowac ogonkow w nazwach plikow.
Probowales

<?php 
conv(iconv_get_encoding($arr))
?>
0

W jaki sposób funkcja ta ma być użyteczna skoro zwraca jedynie typ kodowania?
Nie chciałbym rezygnować z polskich znaków w nazwach plików, skoro są one pobierane przez użytkownika, czyli powinny one odpowiednio się prezentować.. Ewentualną alternatywą jest wczytanie pliku ze znaków ASCII i przesłanie jego zmienionej nazwy, ale już na pierwszy rzut oka widać, że będą z tego same problemy i to pewnie tego samego typu..
Przyznam też, że dopiero teraz zapisałem wszystkie pliki przez klasyczny Notatnik na UTF-8, wcześniej zdałem się na formatowanie kodowania w NotePad++. Gdy się zorientowałem, miałem nadzieję, że będę przepraszać za swoją nieuwagę, jednak i to nie przyniosło efektu, wystąpiły wręcz dodatkowe problemy, choćby związane z potrzebą kodowania jako UTF-8 bez BOM, co automatycznie zmienia plik na ASCII..
Czy ktoś jeszcze ma pomysły na rozwiązanie problemu, tudzież na jego obejście (poprzez nazywanie plików w ASCII, a przesyłanie kompletnych nazw plików).

hopaj napisał(a):

Szczerze to nie powinno sie stosowac ogonkow w nazwach plikow.
Probowales

<?php 
conv(iconv_get_encoding($arr))
?>
1

a próbowałeś z Windows-1250 ?

0
Miang napisał(a):

a próbowałeś z Windows-1250 ?

Nie do wiary... Przyznam szczerze, że zignorowałem Twój pierwszy komentarz, gdyż na tamtą chwilę byłem święcie przekonany, że próbowałem również z windows-1250 i tak faktycznie było. Jednak gdy teraz napisałeś, stwierdziłem "a, co tam" i.. działa! Jak się domyślam, kodowanie na Windows-1250 przyniosło efekty dopiero po zmienieniu kodowania plików na UTF-8, nie znam się na kodowaniu, ale innego wytłumaczenia nie widzę :) Dzięki serdeczne Miang za ponowne podsunięcie odpowiedzi (choć gdybym odpisał na pierwszy komentarz pewnie wciąż bylibyśmy w czarnej dziurze ^^) jak i jurek1980 za naprowadzenie na właściwy tok myślenia i zgłębienie tematu.
Podsumowując: Rozwiązaniem mojego problemu była prdpb. zmiana kodowania plików na UTF-8 (choć w efekcie niektóre pliki wciąż są ASCII..) i użycie kodowania Windows-1250 dla ścieżki pliku.
Jeszcze raz serdecznie dziękuję za pomoc! :)

P.S.: Jak zmienić nazwę posta na rozwiązany?

1 użytkowników online, w tym zalogowanych: 0, gości: 1