Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Jak sprawdzić kodowanie - zawartość zmiennej
Masterson
post 1.08.2011, 11:07:39
Post #1





Grupa: Zarejestrowani
Postów: 14
Pomógł: 0
Dołączył: 18.07.2011

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


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źć?

Ten post edytował Masterson 1.08.2011, 11:08:05
Go to the top of the page
+Quote Post
wNogachSpisz
post 1.08.2011, 12:50:55
Post #2





Grupa: Zarejestrowani
Postów: 1 233
Pomógł: 87
Dołączył: 6.03.2009

Ostrzeżenie: (40%)
XX---


A jaki jest wynik, kiedy dajesz ostatni parametr false, lub wywołujesz bez ostatego parametru?
Go to the top of the page
+Quote Post
Masterson
post 1.08.2011, 12:59:07
Post #3





Grupa: Zarejestrowani
Postów: 14
Pomógł: 0
Dołączył: 18.07.2011

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


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
Go to the top of the page
+Quote Post
mortus
post 1.08.2011, 13:18:41
Post #4





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

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


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.
Go to the top of the page
+Quote Post
l0ud
post 1.08.2011, 13:27:25
Post #5





Grupa: Zarejestrowani
Postów: 1 387
Pomógł: 273
Dołączył: 18.02.2008

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


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

Ten post edytował l0ud 1.08.2011, 13:28:45


--------------------
XMPP: l0ud@chrome.pl
Go to the top of the page
+Quote Post
Masterson
post 1.08.2011, 17:42:42
Post #6





Grupa: Zarejestrowani
Postów: 14
Pomógł: 0
Dołączył: 18.07.2011

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


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

Ten post edytował Masterson 1.08.2011, 17:43:48
Go to the top of the page
+Quote Post
--ja--
post 9.06.2014, 15:02:50
Post #7





Goście







Mozna pominąć pierwszy parametr i php sam sobie dopasuje
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 22.05.2025 - 03:40