konto usunięte

Temat: Konwersja kodowania (ISO-8859-2, ISO-8859-1, ASCII i...

Dokumenty, w szczególności HTML często są "kodowane" wg różnych zestawów (ISO-8859, UTF-8, ASCII, WINDOWS-1252, ISO-8859-1). Również często testując kodowanie za pomocą mb_detect_encoding() jeden dokument zawiera znaki jednocześnie z zestawu np. ISO-8859-2, ASCII, WINDOWS.

Chciałbym ujednolicić kodowanie do UTF-8. Konwersja dokumentów za pomocą mb_convert_encoding() lub iconv() nie jest w 100% skuteczna. Często pojawiają się dziwne "krzaczki".

Jak to zrobić w 100% skutecznie?

konto usunięte

Temat: Konwersja kodowania (ISO-8859-2, ISO-8859-1, ASCII i...

A w jaki sposób w jednym dokumencie masz różne kodowania? To nie dokument ma kodowanie a czytnik wyświetla znaczki według kodowania. Przeglądarce ustawiasz kodowanie strony a nie jej fragmentów. Więc nie do końca rozumiem co masz na myśli, że dokument zawiera wiele różnych kodowań. Taka strona nie miała by prawa się w ogóle poprawnie wyświetlić.

Jak chodzi o samo wykrywanie kodowania to to się tylko tak ładnie nazywa. Ale w praktyce wygląda to tak, że kodowanie się zgaduje na podstawie ciągu bajtów jaki jest podany do funkcji "wykrywającej". A czy funkcja wykryje prawidłowo czy nie tego nie się nie dowiesz programowo. To możesz sprawdzić optycznie - czy po konwersji jest to co powinno być.

EDIT:
Możesz jeszcze po konwersji rozbić tekst na wyrazy i (pod warunkiem, że wiesz w jakim języku jest tekst) porównać to co dostałeś ze słownikiem. Jak trafiłeś powiedzmy 90% (margines na błędy ortograficzne) wyrazów (takich powyżej 3-4 znaków) to pewnie trafiłeś też z kodowaniem. Jak nie to znaczy, że trzeba szukać dalej.Aleksander Wons edytował(a) ten post dnia 06.08.11 o godzinie 19:22
Stanisław Molitorys

Stanisław Molitorys Programista PHP, Web
Developer

Temat: Konwersja kodowania (ISO-8859-2, ISO-8859-1, ASCII i...

Hej.

Ja kiedyś pisałem prostą funkcje do wykrywania kodowania na stronie i zamiany na UTF8. W skrócie, robiłem to w ten sposób, że w pierwszej kolejności sprawdzałem jakie jest kodowanie w nagłówku i na tej podstawie próbowałem przekodować. Jeśli nie wyszło, to próbowałem przekodować wg informacji kodowania na stronie, jeśli i to się nie udało to próbowałem jakimiś innymi funkcjami wykryć kodowanie. Do przekodowania używałem funkcji iconv(), ktora wg mnie działa całkiem ok.

Cała funkcja działała w miarę dobrze, chociaż 100% skuteczności nie było... na ok 1,5 mln rożnych stron, nie udało sie przekodowac ok 150 tys ... tylko, że tam byly przerozne kodowania i tez jakies arabskie, chinskie, rosyjskie, strony były przeróżnie napisane.. te co udało sie przekodować, były ok ... :)

pozdrawiam

konto usunięte

Temat: Konwersja kodowania (ISO-8859-2, ISO-8859-1, ASCII i...

Stanisław Molitorys:
Cała funkcja działała w miarę dobrze, chociaż 100% skuteczności nie było... na ok 1,5 mln rożnych stron, nie udało sie przekodowac ok 150 tys ... tylko, że tam byly przerozne kodowania i tez jakies arabskie, chinskie, rosyjskie, strony były przeróżnie napisane.. te co udało sie przekodować, były ok ... :)

Właśnie o to mi chodzi... Część stron nie udaje się przekodować do UTF-8 co w konsekwencji prowadzi do pojawienia się różnych "krzaczków", tym bardziej nie da się wprowadzić takiego tekstu do bazy danych ze względu na niepoprawne kodowanie.
Stanisław Molitorys

Stanisław Molitorys Programista PHP, Web
Developer

Temat: Konwersja kodowania (ISO-8859-2, ISO-8859-1, ASCII i...

ta moja funkcja działała w ten sposób, że nie dało się czegoś przekodować to po prostu wywalała błąd i tyle... nie miałem takiej sytuacji ze funkcja przekodowała ale źle... u mnie albo było wszystko ok albo się wywalało..
na moje potrzeby działała całkiem znośnie .. i mi to wystarczało

no masz racje, przy probie wprowadzenia inaczej zakodowanego tekstu do bd albo masz krzaki albo ucina tekst.. nie wiem czy da się ten problem jakoś inaczej rozwiązać... może jakby np przechowywać stronę w BLOBie to by było ok, ale to tak tylko strzelam z głowy, nigdy nie sprawdzałem i wątpię żeby to działało :P

piszesz że "część strony nie udało się przekodować", tzn ze inną cześć tej samej strony dało się?? czy jak?? bo nie kumam?? z tego co wiem to jeden i ten sam dokument nie może mieć wielu kodowań naraz ...Stanisław Molitorys edytował(a) ten post dnia 07.08.11 o godzinie 20:06

konto usunięte

Temat: Konwersja kodowania (ISO-8859-2, ISO-8859-1, ASCII i...

Chyba "część strony" należy rozumieć jako podstronę, pojedynczy plik.

Strona może mieć jedno kodowanie, nie więcej...
Ale dane mogą pochodzić z różnych źródeł, z różnym kodowaniem i jest wtedy chaos.

konto usunięte

Temat: Konwersja kodowania (ISO-8859-2, ISO-8859-1, ASCII i...

"Część stron nie udaje..." - chodzi mi o to, że część dokumentów ze wszystkich nie udaje się przekonwertować ;)

Twierdzicie, że dokument może mieć jedno kodowanie... Sprawdzam za pomocą mb_check_encoding() ten sam! dokument...

mb_check_encoding($dokument, 'ISO-8859-2');
mb_check_encoding($dokument, 'ISO-8859-1');
mb_check_encoding($dokument, 'ASCII');
mb_check_encoding($dokument, 'WINDOWS-1252');
mb_check_encoding($dokument, 'UTF-8');

... i przykładowo 1, 3 i 4 zwracają true. Dla mnie to oznacza tylko jedno - dokument zawiera znaki z zestawu ISO-8859-2, ASCII, WINDOWS-1252.

konto usunięte

Temat: Konwersja kodowania (ISO-8859-2, ISO-8859-1, ASCII i...

Paweł Kurpiewski:

... i przykładowo 1, 3 i 4 zwracają true. Dla mnie to oznacza tylko jedno - dokument zawiera znaki z zestawu ISO-8859-2, ASCII, WINDOWS-1252.

Wiesz jak wygląda zapis znaku? To są bajty i w kodowaniach 8 bitowych większość znaków się będzie pokrywać, bo przecież musi. Nie ma innej opcji. Kodowanie to nie jest coś co jest przypisane do danego ciągu bajtów. To ktoś podając dany ciąg bajtów mówi w jakim kodowaniu go podaje, albo odbierający mówi, że akceptuje takie czy inne kodowanie. Jeśli nie wiesz w jakim kodowaniu są znaki na stronie to pozostaje Ci tylko porównanie ze słownikiem. Innej opcji po prostu nie ma.

Czy fakt, że znak o kodzie 0x0C występuje we wszystkich kodowaniach 8 bitowych znaczy, że tekst jest we wszystkich kodowaniach? Nie. Tak na prawdę znaczy to tyle, że może być w jakimkolwiek z tych kodowań. A to czy trafisz na odpowiednie to już inna bajka.
Stanisław Molitorys

Stanisław Molitorys Programista PHP, Web
Developer

Temat: Konwersja kodowania (ISO-8859-2, ISO-8859-1, ASCII i...

Aleksander Wons:

Wiesz jak wygląda zapis znaku? To są bajty i w kodowaniach 8 bitowych większość znaków się będzie pokrywać, bo przecież musi.

dokładnie..
to że znaki się pokrywają nie oznacza ze dokument ma kilka różnych kodowań...
mb_check_encoding to kupiasta funkcja, kiedyś się chwile nią też bawiłem i osobiście nie znajduje dla niej zastosowania w tego typu działaniach.. najlepiej rodzaju kodowania strony www szukać w nagłówku..

konto usunięte

Temat: Konwersja kodowania (ISO-8859-2, ISO-8859-1, ASCII i...

Okej... przyznaje racje :) Jest jedno kodowanie.

konto usunięte

Temat: Konwersja kodowania (ISO-8859-2, ISO-8859-1, ASCII i...


iconv(mb_detect_encoding($string), 'UTF-8', utf8_decode($string));


Ave!
Stanisław Molitorys

Stanisław Molitorys Programista PHP, Web
Developer

Temat: Konwersja kodowania (ISO-8859-2, ISO-8859-1, ASCII i...

Przemek Czekaj:

iconv(mb_detect_encoding($string), 'UTF-8', utf8_decode($string));


Ave!


hehe, jakby to było takie proste.. niestety na swiecie jest troche wiecej kodowac niz UTF, ISO i Windows... niestety Twoje rozwiazanie dla tej proby co ja mialem 1,5 mln roznych domen to zgaduje ze by działało w 10 - 15%.. wzialem pierwsza lepsza chinska stronke i pokolei wzystkie te funkcje sie wykrzaczaja, to samo z cyryylica, nie wspominam o arabskich :D
funckcja mb_detect_encoding nie wykrywa w 100% poprawnie kodowania ...
a i jeszcze rada jak juz uzywac iconv dla UTF8 to w takiej konfiguracji: iconv($kodowanie, 'UTF-8//IGNORE//TRANSLIT', $string);

pozdrawiam

edit: dla cyrylicy wszystkie znaki zamieniło na "?" .. hehe ale sie nie wywaliło <lol> ale generalnie ciezko przewidziec jak to sie zachowaStanisław Molitorys edytował(a) ten post dnia 08.08.11 o godzinie 13:03

konto usunięte

Temat: Konwersja kodowania (ISO-8859-2, ISO-8859-1, ASCII i...

Wiesz co Stanisławie, mam zerowe pojęcie o kodowaniach stringów, i ich sposobie zapisu. Powiem Ci więcej, tak szczerze powiedziawszy, mało mnie to interesuje ;) Jak będę miał jakiś problem z dekodowaniem tekstu, to prędzej czy później coś wymyślę. To rozwiązanie co podałem sprawdzało się przy iso-9958-1, CP1252 oraz UTF-8 w jednym tekście. Ale nie wątpię że przy innych może się wykrzaczyć ;)
Stanisław Molitorys

Stanisław Molitorys Programista PHP, Web
Developer

Temat: Konwersja kodowania (ISO-8859-2, ISO-8859-1, ASCII i...

Przemek Czekaj:
Wiesz co Stanisławie, mam zerowe pojęcie o kodowaniach stringów, i ich sposobie zapisu. Powiem Ci więcej, tak szczerze powiedziawszy, mało mnie to interesuje ;) Jak będę miał jakiś problem z dekodowaniem tekstu, to prędzej czy później coś wymyślę. To rozwiązanie co podałem sprawdzało się przy iso-9958-1, CP1252 oraz UTF-8 w jednym tekście. Ale nie wątpię że przy innych może się wykrzaczyć ;)

:) nie no spoko, nie bierz tego tak do siebie.. po prostu chciałem pojasnic sprawe, bo ostatnio duzo mam z tym do czynienia :D a moze sie komus przyda :D

konto usunięte

Temat: Konwersja kodowania (ISO-8859-2, ISO-8859-1, ASCII i...

Przemek Czekaj:

iconv(mb_detect_encoding($string), 'UTF-8', utf8_decode($string));


Ave!

// windows-1250
łoś -> ?o?

// utf-8
łoś -> ?o?

Fail :)Michał Wachowski edytował(a) ten post dnia 08.08.11 o godzinie 13:32
Piotr Baranowski

Piotr Baranowski Rozwiązuje problemy,
poprawiam świat,
chłonę wiedzę i
prz...

Temat: Konwersja kodowania (ISO-8859-2, ISO-8859-1, ASCII i...

Jeżeli to nie musi być robione przez PHP, to polecam program http://gzegzolka.com/ - jeszcze się na nim nie zawiodłem (aczkolwiek lepiej ustawić kodowanie ręcznie niż zdawać się na automatyczne wykrywanie).
Stanisław Molitorys

Stanisław Molitorys Programista PHP, Web
Developer

Temat: Konwersja kodowania (ISO-8859-2, ISO-8859-1, ASCII i...

Piotr Baranowski:
Jeżeli to nie musi być robione przez PHP, to polecam program http://gzegzolka.com/ - jeszcze się na nim nie zawiodłem (aczkolwiek lepiej ustawić kodowanie ręcznie niż zdawać się na automatyczne wykrywanie).

jesli by chodzilo o jedna stronke to jasne, nie ma co kombinowac ... niestety dla paruset tysiecy to bym musial recznie z miesiac ustawiac.. niestety w moim przypadku musiało to byc robione z automatu

konto usunięte

Temat: Konwersja kodowania (ISO-8859-2, ISO-8859-1, ASCII i...

Piotr Baranowski:
Jeżeli to nie musi być robione przez PHP, to polecam program http://gzegzolka.com/ - jeszcze się na nim nie zawiodłem (aczkolwiek lepiej ustawić kodowanie ręcznie niż zdawać się na automatyczne wykrywanie).

Jeśli trzeba ustawiać kodowanie ręcznie, to po cholerę zaprzęgać do tego procederu kolejny soft?

Najlepszym rozwiązaniem w obecnej sytuacji jest to co podał Stanisław

iconv($kodowanie, 'UTF-8//IGNORE//TRANSLIT', $string);


Bo obojętnie jak skuteczna konwersja by nie była, to i tak teksty trzeba potem przejrzeć.



Wyślij zaproszenie do