Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Konwersja nieznanego kodowania na UTF-8
Domon
post
Post #1





Grupa: Zarejestrowani
Postów: 31
Pomógł: 0
Dołączył: 19.11.2008

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


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 (IMG:style_emoticons/default/wink.gif) .
Pozdrawiam.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 8)
glh
post
Post #2





Grupa: Zarejestrowani
Postów: 97
Pomógł: 20
Dołączył: 18.12.2007
Skąd: Poznań

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


Skoro umiesz wyciągnąć dane takie jak tytuł to nie możesz też odczytać kodowania strony?
Go to the top of the page
+Quote Post
maniana
post
Post #3





Grupa: Zarejestrowani
Postów: 207
Pomógł: 44
Dołączył: 18.05.2007

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


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.
Go to the top of the page
+Quote Post
Domon
post
Post #4





Grupa: Zarejestrowani
Postów: 31
Pomógł: 0
Dołączył: 19.11.2008

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


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?

Ten post edytował Domon 19.04.2012, 14:03:03
Go to the top of the page
+Quote Post
Crozin
post
Post #5





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


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.
Go to the top of the page
+Quote Post
maniana
post
Post #6





Grupa: Zarejestrowani
Postów: 207
Pomógł: 44
Dołączył: 18.05.2007

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


Ew możesz sprawdzić zakres znaków. Jak zakres się zgadza to masz dobre kodowanie. Nie wiem, kombinuje :)
Go to the top of the page
+Quote Post
Crozin
post
Post #7





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


@maniana: Jaki zakres znaków?
Go to the top of the page
+Quote Post
maniana
post
Post #8





Grupa: Zarejestrowani
Postów: 207
Pomógł: 44
Dołączył: 18.05.2007

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


Sprawdzenie regexpem nie pokaże że są krzaczki? Np przepuszczasz tylko a-z0-9 + znaki dodatkowe? Nie wiem czy to ma sens...
Go to the top of the page
+Quote Post
Domon
post
Post #9





Grupa: Zarejestrowani
Postów: 31
Pomógł: 0
Dołączył: 19.11.2008

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


Nieco na odwrót niż zamierzałem w poprzednim poście, bo tam chciałem szukać krzaków a tu szukam polskich liter (IMG:style_emoticons/default/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. }


Ten post edytował Domon 19.04.2012, 18:53:31
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 25.09.2025 - 17:18