Ta strona używa ciasteczek (cookies), dzięki którym nasz serwis może działać lepiej. Dowiedz się więcej OK, rozumiem

Konwertowanie do UTF8

Zdecydowałeś się na tworzenie interaktywnych stron przy pomocy PHP? Chcesz w łatwy i szybki sposób zarządzać danymi na swojej stronie? Tutaj znajdziesz pomoc w napotkanych przy tym trudnościach.

Konwertowanie do UTF8

Post 16.05.2012, 09:07:06

Hej hej hej,
nie wiem w jaki dział to dać, ale chyba najlepiej tutaj.
W skrócie: pobieram funkcją file_get_contents opis strony z kodu, a później za pomocą json przesyłam dane do ajaxa. Json wymaga danych zakodowanych do utf8 i wszystko jest ładnie dopóki nie trafi się strona zakodowana w ISO. Zrobiłem funkcję która wykrywa kodowanie i konwertuje do UTF8 i niby jest lepiej ALE funkcja wypisuje opis tylko do pierwszego polskiego znaku. dalej opis nie przechodzi. Czy ktoś wie jak można zaradzić temu problemowi?
Budzanzky
Posty: 10
Dołączył(a): 16.04.2012

Re: Konwertowanie do UTF8

Post 16.05.2012, 09:13:09

Próbowałeś skorzystać z iconv?
Avatar użytkownikatoszcze
Bartosz Romanowski

SuperGod
SuperGod

Posty: 8902
Dołączył(a): 14.10.2003
Lokalizacja: Mysłowice

Re: Konwertowanie do UTF8

Post 16.05.2012, 09:50:53

wlasnie korzystam z iconv, cała funkcja wygląda tak:

Kod: Zaznacz cały
function conv_encoding($string,$encoding="UTF8") {
   return iconv(mb_detect_encoding($string),$encoding,$string);
}


niezaleznie czy wpisze utf8, czy utf-8 zawsze sie zatnie przy polskim znaku, jezeli opis brzmi np "Już teraz"

to zwróci mi samo "Ju" dalej nie idzie...
Budzanzky
Posty: 10
Dołączył(a): 16.04.2012

Re: Konwertowanie do UTF8

Post 16.05.2012, 10:09:25

A sprawdzałeś co zwraca mb_detect_encoding($string) ? Upewnij się, że wykrywa poprawne kodowanie, a jeśli nie, to rozważ użycie drugiego argumentu funkcji mb_detect_encoding.
Avatar użytkownikakuku
Rafał Kukawski

+∞
+∞

Posty: 19797
Dołączył(a): 14.04.2002

Re: Konwertowanie do UTF8

Post 16.05.2012, 10:22:42

Sprawdzę po 12 i dam znać, o jakim drugim argumencie mówisz?
Budzanzky
Posty: 10
Dołączył(a): 16.04.2012

Re: Konwertowanie do UTF8

Post 16.05.2012, 11:29:55

Drugim argumenie funkcji mb_detect_encoding, w którym możesz przekazać listę i kolejność kodowań do sprawdzenia. Sprawdź co zwraca mb_detect_order(). Może akurat nie zawiera kodowań jakich Ty się spodziewasz.
Avatar użytkownikakuku
Rafał Kukawski

+∞
+∞

Posty: 19797
Dołączył(a): 14.04.2002

Re: Konwertowanie do UTF8

Post 16.05.2012, 23:11:14

samo mb_detect_encoding wykrywa kodowanie ASCII przy np onecie..
a mb_detect_order zwraca false...

jakieś pomysły? może jest jakieś inne rozwiązanie niż inconv?
Budzanzky
Posty: 10
Dołączył(a): 16.04.2012

Re: Konwertowanie do UTF8

Post 17.05.2012, 08:35:41

UPDATE: Potestowałem rano skrypcik i spostrzeżenia następujące:
niezależnie od zadeklarowanego kodowania, detect encoding zawsze zwraca ASCII, jeśli na sztywno wpiszę, żę ma konwertować z ISO do UTF8 to konwertuje ładnie, ale jak już trafi się strona z innym kodowaniem to albo nie zwraca nic, albo zwraca krzaczki. Coś jest nie tak z przechwytywaniem kodowania strony - jeśli uda się jakoś zrobić rozpoznanie kodowania inaczej niż za pomocą mb_detect to jest szansa na wyeliminowanie problemu.

Myślałem o pregmatchu, lub mam też funkcję działajacą trochę ładniej niż pregmatch :

Kod: Zaznacz cały
   function get($a,$b,$c)
   {
   $y = explode($b,$a);
   $x = explode($c,$y[1]);
   return $x[0];
   }


$a - string z tekstem który przeszukujemy
$b - string po którym ma wycinać
$c string po którym ma skończyć wycinanie..

chciałbym, żeby skrypt działał możliwie jak najszybciej, nie wiem czy pregmatch i mój get za bardzo go nie obciążą, czy koledzy (lub koleżanki) zaproponują jakieś alternatywne rozwiązanie problemu?
Budzanzky
Posty: 10
Dołączył(a): 16.04.2012

Re: Konwertowanie do UTF8

Post 17.05.2012, 10:17:34

Nie napisałeś, czy kombinowałeś z różnymi argumentami dla funkcji mb_detect_encoding. Gdybyś spróbował na przykład w ten sposób

Kod: Zaznacz cały
function conv_encoding($string,$encoding="UTF8") {
    return iconv(mb_detect_encoding($string, 'utf-8,iso-8859-2,TUTAJ_OPCJONALNIE_DOPISZ_INNE_KODOWANIA_KTÓRYCH_SIĘ_SPODZIEWASZ_W_DANYCH_WEJŚCIOWYCH'), $encoding,$string);
}

oczywiście przetestuj co zwraca samo wywołanie mb_detect_encoding($string, 'utf-8,iso-8859-2,TUTAJ_OPCJONALNIE_DOPISZ_INNE_KODOWANIA_KTÓRYCH_SIĘ_SPODZIEWASZ_W_DANYCH_WEJŚCIOWYCH')

Sprawa jest taka, że nie można polegać na domyślnych wartościach wpisanych w konfigurację, ponieważ te najczęściej dotyczą zachodniej Europy albo USA. No i niektóre kodowania są podobne/prawie identyczne, że ciężko stwierdzić, które kodowanie jest akurat w użyciu. Przykładem niech będą kodowania ISO-8859-*. Jeśli w liście kodowań podasz 8859-1 przed 8859-2, to dla onetu dostaniesz te pierwsze.

Poza tym, jeśli korzystasz z funkcji mb_*, to może zamiast iconv, warto rozważyć użycie mb_convert_encoding. Ale to sprawa czysto filozoficzna.
Avatar użytkownikakuku
Rafał Kukawski

+∞
+∞

Posty: 19797
Dołączył(a): 14.04.2002

Re: Konwertowanie do UTF8

Post 17.05.2012, 10:53:12

@kuku: Wielkie dzięki. to rozwiązało moje wszystkie problemy jak dotąd, oczywiście tak kombinowałem, że nie przetestowałem dodatkowego argumentu o którym pisałeś wczoraj.

Moja funkcja get, która miała łapać encoding działała w sumie we wszystkich linkach, które sprawdziłem ale na youtube już sie wysypała - w kodzie nie ma zapisanego kodowania. Co tez mnie strasznie zdziwiło no ale ok... ;) pewnie jakoś inaczej to wywołują.

czy zastosowanie mb_concert zamiast iconv ma jakies sensowne uzasadnienie? nie upieram się na iconv ale, też nie widzę sensu zmiany na mb_convert
Budzanzky
Posty: 10
Dołączył(a): 16.04.2012

Re: Konwertowanie do UTF8

Post 17.05.2012, 11:37:04

Co tez mnie strasznie zdziwiło no ale ok... ;)

nie ma co się dziwić. Znacznik <meta> z atrybutem http-equiv służy do „prostszego” — bo nie trzeba grzebać w ustawieniach serwera — poinformowania przeglądarki, jakiego kodowania użyć. Ale jest on tylko alternatywą dla nagłówka HTTP Content-Type, a Youtube odsyła stronę z nagłówkiem

Content-Type text/html; charset=utf-8

czyli przeglądarka ma info o kodowaniu bez konieczności wstępnego parsowania dokumentu, co jest znacznie lepsze.

czy zastosowanie mb_concert zamiast iconv ma jakies sensowne uzasadnienie? nie upieram się na iconv ale, też nie widzę sensu zmiany na mb_convert

nie, jak pisałem sprawa czysto filozificzna. Korzystasz z funkcji z rodziny mb_* do wykrywania kodowania, to czemu nie trzymać się jednej rodziny funkcji do wykonywania całej roboty. Ale praktycznie nie ma żadnej różnicy której użyjesz dopóki działa. Możliwe nawet, że mb_convert wewnętrznie korzysta z iconv. Ot po prostu, ktoś kiedyś zaglądnie do kodu i może się zastanowić, „hmm, tu używamy mb_detect_encoding. Czyżby mb_convert była zepsuta, że użyto iconv?”. Takie sobie gdybanie.
Avatar użytkownikakuku
Rafał Kukawski

+∞
+∞

Posty: 19797
Dołączył(a): 14.04.2002

Re: Konwertowanie do UTF8

Post 17.05.2012, 12:05:07

No cóż, raczej nikt nie będzie zaglądać poza mną ;)
teraz muszę ogarnąc ten burdel w kodzie jaki zrodził sie przy testowaniu kolejnych pomysłów... no ale to już jest moment tak na prawdę. Wielkie dzięki za pomoc :) Kto wie czy jeszcze się nie odezwę, bo ogólnie to przechhwytywanie to jest tylko fragment ogromnego projektu, który jak myślałem pójdzie sprawnie a tu coraz więcej problemów... ;)
Budzanzky
Posty: 10
Dołączył(a): 16.04.2012


Powrót do PHP i bazy danych


 


  • Podobne wątki
    Odpowiedzi
    Wyświetlone
    Ostatni post

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 2 gości

Hosting, Domeny, SSL

Subskrypcja

Mamy 52012 zarejestrowanych użytkowników.
Najnowszy użytkownik: domenki123


Nasi użytkownicy napisali:

  • 938321 wiadomości
  • w 247833 tematach

Najnowsze wpisy na blogu

Najnowsze artykuły

Najaktywniejsi (ostatnie 30 dni)