Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Konwersja nieznanego kodowania na UTF-8
Forum PHP.pl > Forum > PHP
Domon
Witam, piszę skrypt który z podanej przez użytkownika strony wyciąga tytuł, opis oraz tagi OpenGraphProtocol. Skrypt wygląda tak, że przez CURL pobierane jest źródło strony a następnie przez preg_match() pobierane są interesujące mnie dane. Wszystko ładnie gdyby nie to, że strony są w różnych kodowaniach i skrypt rzuca krzaczkami. Próbowałem napisać funkcję, która zwróci mi "naprawiony" string z polskimi literami używając głównie mb_detect_encoding() i iconv(), jednak żadne rozwiązanie nie było na tyle dobre aby rozwiązać problem do końca. Jeśli coś działało mi np przy ISO-8859-2 nie działalo np przy UTF-8 itd.

Szukałem rozwiązania i na forum.php.pl i na innych ale nie znalazłem nic co rozwiązałoby problem, a mi samemu skończyły się już pomysły.
Miał ktoś kiedyś podobny problem? Jakiś pomysł na wykonanie tego?

Liczę na Waszą pomoc wink.gif.
Pozdrawiam.
glh
Skoro umiesz wyciągnąć dane takie jak tytuł to nie możesz też odczytać kodowania strony?
maniana
Przy pobieraniu danych ze strony, ona informuje cię o kodowaniu. Zobacz czy da się ją poprawnie przetworzyć jako dokument XML. Wtedy wsio powinno iść z automatu.
Domon
Tylko, że kodowanie strony może zupełnie nie być podane w meta tagach ani nagłówku...
Męcząc się z problemem dalej napisałem coś takiego:
  1. function utf8fix($str)
  2. {
  3. $ary = array('ASCII', 'UTF-8', 'ISO-8859-2', 'ISO-8859-1');
  4. $detect = mb_detect_encoding($str, $ary);
  5.  
  6. $iconv = iconv($detect, 'UTF-8', $str);
  7. return $iconv;
  8. }

Wygląda na to, że działa z wyjątkiem niektórych stron kodowanych w UTF-8. Otóż np wklejając link do filmu z YT w tytule mam polskie znaki ale w opisie już nie. Gdy na zmienną $iconv dam utf8_decode() polskie znaki są w opisie a nie ma w tytule. Istnieje jakiś sposób, żeby (najprawdopodobniej przez preg_match) sprawdzić czy tekst ma jakiekolwiek krzaki?
Crozin
Kodowanie masz podane w nagłówku Content-Type. Jeżeli go tam nie ma, powinieneś przyjąć, że treść kodowania jest przy użyciu ISO-8859-1.
Cytat
The "charset" parameter is used with some media types to define the character set (section 3.4) of the data. When no explicit charset parameter is provided by the sender, media subtypes of the "text" type are defined to have a default charset value of "ISO-8859-1" when received via HTTP. Data in character sets other than "ISO-8859-1" or its subsets MUST be labeled with an appropriate charset value.
maniana
Ew możesz sprawdzić zakres znaków. Jak zakres się zgadza to masz dobre kodowanie. Nie wiem, kombinuje :)
Crozin
@maniana: Jaki zakres znaków?
maniana
Sprawdzenie regexpem nie pokaże że są krzaczki? Np przepuszczasz tylko a-z0-9 + znaki dodatkowe? Nie wiem czy to ma sens...
Domon
Nieco na odwrót niż zamierzałem w poprzednim poście, bo tam chciałem szukać krzaków a tu szukam polskich liter smile.gif. Ale ważne, że w końcu działa.
Dla potomnych:
  1. function utf8fix($str)
  2. {
  3. $ary = array('ASCII', 'UTF-8', 'ISO-8859-2', 'ISO-8859-1');
  4. $detect = mb_detect_encoding($str, $ary);
  5.  
  6. $iconv = iconv($detect, 'UTF-8', $str);
  7.  
  8. if (preg_match('/[ęóąśłżźćńĘÓĄŚŁŻŹĆŃ]/', utf8_decode($iconv)))
  9. {
  10. return utf8_decode($iconv);
  11. }
  12. else
  13. {
  14. return $iconv;
  15. }
  16. }
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.