Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Jak sprawdzić kodowanie - zawartość zmiennej
Forum PHP.pl > Forum > Przedszkole
Masterson
Witam serdecznie.

W zmiennej $dane mam opis, który jest pobierany z pliku tekstowego. Plik tekstowy ma kodowanie ISO-8559-2 lub Windows-1250. Chcę sprawdzić kodowanie ponieważ za pomocą iconv konwertuję zawartość do UTF-8.

Szukałem w sieci (również na forum) i nie znalazłem niczego co by zadziałało.

Ostatnie rozwiązanie, które sprawdzałem i które niby działa:
  1. $encoding = mb_detect_encoding($dane, 'ISO-8859-2, Windows-1250, UTF-8', true);
  2. echo $encoding;


Niestety echo nie zwraca żadnej wartości (nie wykrywa kodowania zmiennej), ktoś wie jak to ugryźć?
wNogachSpisz
A jaki jest wynik, kiedy dajesz ostatni parametr false, lub wywołujesz bez ostatego parametru?
Masterson
Niestety bez zmian. Okazuje się, że ta funkcja akurat nie do końca działa z ISO-8859-2 i Windows-1250.
Problem polega na tym, że w zależności od kodowania pliku ($dane) chcę użyć innego parametru dla iconv

Pliki, z których wyciągam dane to pliki txt, które mogą wystąpić w 2 kodowaniach (Windows-1250 lub ISO-8859-2).
Znacie może inny, skuteczny sposób na sprawdzenie kodowania?

Próbowałem również przez preg_match, ale bezskutecznie (przykład z http://php.net/manual/en/function.mb-detect-encoding.php).

Pozdrawiam
mortus
Trochę mnie dziwi, że funkcja mb_detect_encoding() nie działa. Alternatywnym sposobem może być funkcja opisana na mynthon.net.

Sprawdź jeszcze czym jest zmienna $encoding:
  1. // zamiast
  2. echo $encoding;
  3. // użyj
  4. var_dump($encoding);

Może funkcja działa, tylko po prostu nie rozpoznaje kodowania, co mogłoby oznaczać, że kodowanie jest inne, niż byśmy oczekiwali.
l0ud
Jest jeszcze inny, banalniejszy sposób. Po prostu przeszukaj string na obecność znaków, przy których te kodowania się różnią. Jeżeli np. znajdziesz 'ś' w kodowaniu ISO, to właśnie takie jest kodowanie. W przeciwnym wypadku kodowanie to Windows-1250. Dla zwiększenia szansy poprawnego rozpoznania obsłuż wszystkie istotne znaki: (wielkie i małe litery ą,ś,ź)

niemniej, oczywiście dużo wygodniejsze byłoby użycie mb_detect_encoding...
Masterson
Zrobiłem tak:

  1. function converter($str) {
  2. $arr=array( chr(185)=>'windows-1250');
  3. return strtr($str,$arr);
  4. }
  5.  
  6. $content = converter ($dane);
  7.  
  8. $check = 'windows-1250';
  9. $pos = strpos($content, $check);
  10.  
  11. if ($pos === false) {
  12. $encoding = "ISO-8859-2";
  13. } else {
  14. $encoding = "Windows-1250";
  15. }
  16.  
  17. echo iconv($encoding,"UTF-8",$dane)


Nie jest to na pewno profesjonalne rozwiązanie, ale działa poprawnie. Użyłem strtr ponieważ nie wiem jak inaczej można sprawdzić obecność danego znaku ASCII w zmiennej. Próbowałem preg_match i strpos i nie wykrywało mi znaku 'chr(185)' (pewnie popełniam błąd w składni) stąd tak na około, najpierw zamiana znaku na konkretny string i uzależnienie kodowania od owego stringu (litera ą i kilka innych mają inny nr w ASCII dla ISO i Windows). Jak ktoś wie jak powinienem to zrobić aby było "poprawniejsze" to proszę o sugestie smile.gif
-ja-
Mozna pominąć pierwszy parametr i php sam sobie dopasuje
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.