Patrzę jaki ma encoding, na tej podstawie decoduje tekst.
Patrzę jakie ma kodowanie i na tej podstawie koduje na utf8, czyli np. z iso-8859-2 zamieniam na utf8
Do tej pory wszystko było ok. Ale dziś natrafiłem na maile, które zachowywałe się bardzo dziwnie.
Może przedstawię pseudokod jak do tej pory robiłem i było dobrze:
Kod
$body = 'Tutaj wiadomosc pobrana z imap';
jesli encoding = 1 to przepuszczaj wiadomosc przez imap_8bit()
jesli jest charset, to zamieniaj z danego charset na utf8
jesli encoding = 1 to przepuszczaj wiadomosc przez imap_8bit()
jesli jest charset, to zamieniaj z danego charset na utf8
I to jak pisałem działało do dzisiaj.
Dziś trafiłem na wiadomość o treści: Cze?? czyli po poprawnym przekonwertowaniu ma wyjść Cześć.
Niestety, po przekonwertowaniu wychodzi: Cze=B6=E6
Wiadomośc jest w kodowaniu iso-8859-2 wiec te krzaczki to są odpowiedniki w iso polskich liter.
Jak się okazało, jeśli pominę krok:
"jesli encoding = 1 to przepuszczaj wiadomosc przez imap_8bit()"
to wiadomość jest poprawnie przekonwertowana.
No i teraz mam zagwostkę, bo niektóre maile wymagają by konwertować je w zależności od encoding, a inne jak ten okazało się że nie. Nie jestem w stanie znaleźć zależności, która mi powie, które konwertować a które nie.
Podam jeszcze atrybuty jakie zwraca imap dla tej wiadomosci:
Cytat
[type] => 0
[encoding] => 1
[ifsubtype] => 1
[subtype] => PLAIN
[ifdescription] => 0
[ifid] => 0
[lines] => 19
[bytes] => 525
[ifdisposition] => 0
[ifdparameters] => 0
[ifparameters] => 1
[parameters] => Array
(
[0] => stdClass Object
(
[attribute] => CHARSET
[value] => ISO-8859-2
)
[1] => stdClass Object
(
[attribute] => FORMAT
[value] => flowed
)
)
)
[encoding] => 1
[ifsubtype] => 1
[subtype] => PLAIN
[ifdescription] => 0
[ifid] => 0
[lines] => 19
[bytes] => 525
[ifdisposition] => 0
[ifdparameters] => 0
[ifparameters] => 1
[parameters] => Array
(
[0] => stdClass Object
(
[attribute] => CHARSET
[value] => ISO-8859-2
)
[1] => stdClass Object
(
[attribute] => FORMAT
[value] => flowed
)
)
)