Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> imap kodowanie
nospor
post
Post #1





Grupa: Moderatorzy
Postów: 36 559
Pomógł: 6315
Dołączył: 27.12.2004




Cześć, mam pewien problemi. Odbieram imapem wiadomości z gmaila.
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

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
)

)

)
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
abort
post
Post #2





Grupa: Zarejestrowani
Postów: 590
Pomógł: 107
Dołączył: 25.10.2011

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


@Bags_Bunny: Quoted-printable (QP) wstawia zakodowany znak za pomocą sekwencji: anak równości ("=") z następującym zaraz za tym znakiem kodem heksadecymalnym tego znaku. Przypadkiem się składa, że znak równości ma kod ASCII 61, czyli heksadecymalnie 3D. I kodowanie QP zamienia znak "=" na "=3D", POZORNIE dodając niepotrzebne znaki. Jedyny taki przypadek, ale dość charakterystyczny. I bardzo widoczny przy przesyłaniu HTMLi (IMG:style_emoticons/default/smile.gif)

@nospor: Ale, ale... Z manuala:
imap_8bit — Convert an 8bit string to a quoted-printable string
Czyli dekoduje Ci "Cześć" na "Cze=B6=E6" - i robi to zgodnie z założeniami i całkiem poprawnie. Pytanie jest inne: po co to dekodujesz do QP, skoro masz:
Kod
[0] => stdClass Object
(
[attribute] => CHARSET
[value] => ISO-8859-2
)


IMHO wiadomość jest "imap/8it", ale ta akurat część ma ściśle zdefiniowany format - wystarczy go odczytać i się do niego zastosować.

Na marginesie: na pierwszy rzut oka podejrzewałem jakiś "broken" mailer. Lata temu (za czasów wprowadzania ISO-8859-2) była taka sytuacja, że mailery (tudzież czytniki news) wysyłały znaki kodowane w ISO-8859-2, ale w nagłówku wstawiały na bezczelnego iso-8859-1 (albo wręcz us-ascii).

P.S.
@nospor: niepożądany (IMG:style_emoticons/default/smile.gif)

Ten post edytował abort 23.12.2011, 00:19:52
Go to the top of the page
+Quote Post

Posty w temacie


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: 13.10.2025 - 23:32