Discussion:
Problemes avec base64 decoding
(trop ancien pour répondre)
stef_204
2014-07-10 09:55:27 UTC
Permalink
Bonjour,

Merci d'avoir un peu de patience et tolérance--je suis un newbie de PHP.
Pour le moment, je n'ai que modifié des scripts PHP libres--selon mes
besoins.

Je suis en train d'apprendre mais le chemin est long.
J'ai un problème a résoudre lié a mon travail--et malheureusement je dois
le faire rapidement.

J'essaie d'utiliser le script que j'ai posté ici (qui génère un feed rss
a partir des emails d'un compte IMAP):

<http://codepad.org/Cl7C4Xb9>

Tour marche MAIS, tant le sujet que le "body" du mail, tous les deux
encodé en base64, ne sont PAS décodés.

Les adresses des auteurs des mail sont lisibles par contre (elles sont en
"plain text").

Donc, quand j'utilise ensuite un rss reader, tout ce que je vois est du
texte encodé en base64 et donc illisible. Idem si j'utilise un
navigateur pour voir la page html d'un post/email spécifique ou la page
"générale" avec une liste de tous les mails/le feed rss.

J'ai essayé de résoudre cela en utilisant (ligne 234):

<html>
<head>
<title><?php echo mb_decode_mimeheader($subject);?></title>
</head>
<body>
<div style="background:#eeeeee; border:solid 1px"
<strong><?php echo mb_decode_mimeheader($subject); ?></strong><br />
<i><?php echo "by: ".$author.", @ ".$entryDate;?></i>
</div>
<br />
<?php echo base64_decode($body); ?>
</body>
</html>

Pour les pages HTML créés pour chaque mail, "mb_decode_mimeheader"
fonctionne pour le sujet.

l'auteur et la date sont déjà en plain text donc lisibles.

Mais base64_decode pour le "body" ne marche pas--ou seulement
partiellement. cela produit un texte seulement a moitié lisible, avec
beaucoup de caracteres du style: "ÄÄЀ€€€€Ø䀀€€€€ÐÀ€€À" ou autres.

(Il y a peut-être un problème supplémentaire lié au charset utf-8.)

J'aimerais aussi que la page avec le feed rss (la page "générale") avec
la liste de tous les mails soit lisible (donc décodée de base64).

Je pense devoir appliquer un decoding base64 (ou une fonction similaire)
soit dans la section qui commence ligne 264 et ou 333 ou 350, soit devoir
modifier les fonctions définies en début de script pour y ajouter le
decoding.

Il y a 2 ou 3 fonctions qui pourraient devoir être modifiées comme:
reEncodeString ou renderPlainText....

Je recherche la SIMPLICITÉ.

J'ai passé plusieurs heures dessus, et suis bloqué.

J’apprécierais beaucoup un coup de pouce.

Merci.
Olivier Miakinen
2014-07-10 16:29:35 UTC
Permalink
Bonjour,
Post by stef_204
J'essaie d'utiliser le script que j'ai posté ici (qui génère un feed rss
<http://codepad.org/Cl7C4Xb9>
Tour marche MAIS, tant le sujet que le "body" du mail, tous les deux
encodé en base64, ne sont PAS décodés.
Les adresses des auteurs des mail sont lisibles par contre (elles sont en
"plain text").
[...]
J’apprécierais beaucoup un coup de pouce.
Tout d'abord, je précise que les adresses des auteurs des mails
*pourraient* en principe être encodées en base64 également, ou en
quoted-printable.

Pour mener à bien ta traduction, tu dois savoir les choses suivantes :
1) Quel charset est utilisé dans le feed rss généré. Il faut qu'il
puisse repésenter tous les caractères Unicode, et à priori UTF-8 me
semble le meilleur choix. Je vais supposer que c'est bien UTF-8.
2) Comment est codé un corps de message. Ceci est expliqué dans le
RFC 2045 : <http://tools.ietf.org/html/rfc2045>.
3) Quel charset et quel encodage sont utilisés dans le message que
tu dois transmettre. Il faut pour cela regarder les entêtes
Content-Type et Content-Transfer-Encoding.
4) Comment est codé un entête de message. Ceci est expliqué dans le
RFC 2047 : <http://tools.ietf.org/html/rfc2047>.
5) Pour chacun des entêtes du message, quels sont le charset et
l'encodage utilisés.


Prenons l'exemple du corps du message. Le Content-Type peut contenir
par exemple « charset=UTF-8 » ou « charset=ISO-8859-1 » ou n'importe
quel autre charset. Quant au Content-Transfer-Encoding, il peut
contenir par exemple "8bit" ou "base64" ou "quoted-printable".

Le cas le plus simple, c'est "UTF-8" et "8bit". Puisque ton feed rss
est en UTF-8 (si j'ai bien supposé), il n'y a rien à faire, le texte
est lisible tel quel :
$body

Si c'est "UTF-8" et "base64", tu dois décoder le base64, ce que tu sais
faire, et c'est tout :
base64_decode($body)

Mais si c'est par exemple "ISO-8859-15" et "base64", après avoir
décodé le base64 tu dois en plus convertir le texte de "ISO-8859-15"
en "UTF-8" :
mb_convert_encoding(base64_decode($body), "UTF-8", "ISO-8859-15"))

Bien sûr, si c'est de l'ISO-8859-15 en 8bit, il faut juste convertir
le charset, sans décoder du base64 :
mb_convert_encoding($body, "UTF-8", "ISO-8859-15")

Et ainsi de suite, pour les autres charsets, et aussi (si jamais tu
le rencontrais) pour l'encodage en quoted-printable au lieu de base64.


Voilà, j'espère que ma réponse va t'aider.

Cordialement,
--
Olivier Miakinen
stef_204
2014-07-11 08:30:42 UTC
Permalink
On Thu, 10 Jul 2014 18:29:35 +0200, Olivier Miakinen wrote:

[snip]
Mais si c'est par exemple "ISO-8859-15" et "base64", après avoir décodé
le base64 tu dois en plus convertir le texte de "ISO-8859-15" en "UTF-8"
mb_convert_encoding(base64_decode($body), "UTF-8", "ISO-8859-15"))
[snip]

Oui, ta reponse m'aide, bien entendu.
Je regarde tout ca.
Merci.

Loading...