Brak liter 'ś' oraz 'ą' w kodowaniu

Brak liter 'ś' oraz 'ą' w kodowaniu
SP
  • Rejestracja:ponad 6 lat
  • Ostatnio:około 4 lata
  • Postów:21
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.

Kopiuj
$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.

edytowany 2x, ostatnio: SentalPL
jurek1980
  • Rejestracja:ponad 8 lat
  • Ostatnio:minuta
  • Postów:3459
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.

SP
  • Rejestracja:ponad 6 lat
  • Ostatnio:około 4 lata
  • Postów:21
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.

edytowany 1x, ostatnio: SentalPL
jurek1980
  • Rejestracja:ponad 8 lat
  • Ostatnio:minuta
  • Postów:3459
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

edytowany 1x, ostatnio: jurek1980
SP
  • Rejestracja:ponad 6 lat
  • Ostatnio:około 4 lata
  • Postów:21
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

Miang
  • Rejestracja:prawie 7 lat
  • Ostatnio:3 minuty
  • Postów:1659
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


dzisiaj programiści uwielbiają przepisywać kod z jednego języka do drugiego, tylko po to by z projektem nadal stać w miejscu ale na nowej technologii
jurek1980
  • Rejestracja:ponad 8 lat
  • Ostatnio:minuta
  • Postów:3459
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.

hopaj
  • Rejestracja:ponad 6 lat
  • Ostatnio:ponad 5 lat
  • Postów:67
0

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

Kopiuj
<?php 
conv(iconv_get_encoding($arr))
?>
edytowany 1x, ostatnio: hopaj
SP
  • Rejestracja:ponad 6 lat
  • Ostatnio:około 4 lata
  • Postów:21
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

Kopiuj
<?php 
conv(iconv_get_encoding($arr))
?>
edytowany 2x, ostatnio: SentalPL
Miang
  • Rejestracja:prawie 7 lat
  • Ostatnio:3 minuty
  • Postów:1659
1

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


dzisiaj programiści uwielbiają przepisywać kod z jednego języka do drugiego, tylko po to by z projektem nadal stać w miejscu ale na nowej technologii
SP
  • Rejestracja:ponad 6 lat
  • Ostatnio:około 4 lata
  • Postów:21
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?

edytowany 1x, ostatnio: SentalPL
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)