OVH Cloud OVH Cloud

Conversion ISO8859

15 réponses
Avatar
Gloops
Bonjour tout le monde,

Pour convertir des caractères ISO8859 (et consor), que connaissez-vous
de plus efficace ? La taille prise en mémoire semble importante.

Voilà ce que j'ai derrière la tête : j'ai écrit un petit client mail
pour savoir rapidement si j'ai reçu des mails, sans avoir à charger
Eudora ou Mozilla. Mais voilà, ça ne me plaisait pas du tout du tout de
voir dans les sujets des messages, voire les noms des expéditeurs, des
décorations du genre ISO8859-1?=?, alors j'ai écrit ma moulinette pour
décoder tout ça, à force d'en ajouter ça finit par être assez efficace,
seulement d'un autre côté, à force d'en ajouter il faut y mettre de la
bonne volonté pour dire que ça se charge plus vite que Eudora ou Mozilla.

J'aurais cru que les "grands" logiciels de mails étaient lourds surtout
parce qu'ils gèrent des fichiers et des capacités de tri, ce dont on n'a
rien à faire dans un client "léger", mais apparemment, le décodage des
caractères accentués prend une importance que j'avais sous-évaluée.

Je n'ai rien vu de tout prêt dans les API, mais peut-être ma doc
n'est-elle pas complète ?

10 réponses

1 2
Avatar
Jean-Marc
"Gloops" a écrit dans le message de
news:43479262$0$27434$
Bonjour tout le monde,

Pour convertir des caractères ISO8859 (et consor), que connaissez-vous
de plus efficace ? La taille prise en mémoire semble importante.

Voilà ce que j'ai derrière la tête : j'ai écrit un petit client mail
pour savoir rapidement si j'ai reçu des mails, sans avoir à charger
Eudora ou Mozilla. Mais voilà, ça ne me plaisait pas du tout du tout de
voir dans les sujets des messages, voire les noms des expéditeurs, des
décorations du genre ISO8859-1?=?, alors j'ai écrit ma moulinette pour
décoder tout ça, à force d'en ajouter ça finit par être assez efficace,
seulement d'un autre côté, à force d'en ajouter il faut y mettre de la
bonne volonté pour dire que ça se charge plus vite que Eudora ou Mozilla.

J'aurais cru que les "grands" logiciels de mails étaient lourds surtout
parce qu'ils gèrent des fichiers et des capacités de tri, ce dont on n'a
rien à faire dans un client "léger", mais apparemment, le décodage des
caractères accentués prend une importance que j'avais sous-évaluée.

Je n'ai rien vu de tout prêt dans les API, mais peut-être ma doc
n'est-elle pas complète ?



Hello,

Il faudrait en dire un peu plus sur ta moulinette,
car décoder de l'iso8859 sur un petit nombre
de caractères (quelques lignes de nom, adresses, sujet)
ne peut pas être lent, même avec une méthode bestiale.

Es tu sur que la "lenteur" de ton soft vient de ton décodage?
Si oui, quelle méthode utilises tu ?

Peux tu en plus donner un petit exemple du genre:
AVANT/APRES

--
Jean-marc
Tester mon serveur (VB6) => http://myjmnhome.dyndns.org
"There are only 10 kind of people
those who understand binary and those who don't."
mailto: remove '_no_spam_' ;
Avatar
Gloops
Bon, alors voilà ma méthode bestiale :

Function ConvISO8859(strIn As String, Optional bConv As Variant) As String
Dim N As Integer, intPrec As Integer
Dim strRepereGauche As String, strRepereDroit As String
Dim strOut As String, strTmp As String

On Error GoTo ErrConvISO8859
If IsMissing(bConv) Then bConv = True
If InStr(strIn, "=?iso-8859-1?Q?") > 0 Then strRepereGauche =
"=?iso-8859-1?Q?"
If InStr(strIn, "=?ISO-8859-1?Q?") > 0 Then strRepereGauche =
"=?ISO-8859-1?Q?"
If InStr(strIn, "=?ISO-8859-1?q?") > 0 Then strRepereGauche =
"=?ISO-8859-1?q?"
If InStr(strIn, "=?iso-8859-1?q?") > 0 Then strRepereGauche =
"=?iso-8859-1?q?"
If InStr(strIn, "=?iso-8859-1?B?") > 0 Then strRepereGauche =
"=?iso-8859-1?B?"
If InStr(strIn, "=?ISO-8859-1?B?") > 0 Then strRepereGauche =
"=?ISO-8859-1?B?"
If InStr(strIn, "=?iso-8859-15?q?") > 0 Then strRepereGauche =
"=?iso-8859-15?q?"
If InStr(strIn, "=?ISO-8859-15?Q?") > 0 Then strRepereGauche =
"=?ISO-8859-15?Q?"
If InStr(strIn, "=?iso-8859-15?Q?") > 0 Then strRepereGauche =
"=?iso-8859-15?Q?"
If InStr(strIn, "=?windows-1256?Q?") > 0 Then strRepereGauche =
"=?windows-1256?Q?"
If InStr(strIn, "=?windows-1252?Q?") > 0 Then strRepereGauche =
"=?windows-1252?Q?"
N = InStr(strIn, strRepereGauche) + Len(strRepereGauche)
strIn = Left$(strIn, N) + Replace(Mid$(strIn, N + 1), strRepereGauche, " ")
strRepereDroit = "?="
'If (InStr(strIn, strRepereGauche) = 0 Or InStr(strIn, strRepereDroit) =
0) Then
' ConvISO8859 = strIn
' Exit Function
'End If
N = 1
N = InStr(N, strIn, strRepereGauche, vbTextCompare)
If N = 0 Then
ConvISO8859 = ConvAccents(Replace(strIn, "=?iso-8859-1?B?6Q==?=", "é"))
Exit Function
End If
intPrec = N - 1 + Len(strRepereGauche)
strOut = Left$(strIn, N - 1)
While N > 0
N = InStr(intPrec + 1, strIn, strRepereDroit)
strTmp = Mid$(strIn, intPrec + 1, N - intPrec - 1)
strOut = strOut + IIf(bConv, localConvISO8859(strTmp), strTmp)
N = InStr(N + 1, strIn, strRepereGauche, vbTextCompare) - 1
intPosGauche = intPrec + Len(strTmp) + 1 + Len(strRepereDroit)
intLongueur = N + 1 - intPosGauche
If intLongueur > 0 Then strOut = strOut + Mid$(strIn, intPosGauche,
intLongueur)
intPrec = N + Len(strRepereGauche)
Wend
If InStr(strIn, strRepereDroit) < Len(strIn) - Len(strRepereDroit) Then
strOut = strOut + Right$(strIn, Len(strIn) - InStr(strIn,
strRepereDroit) - 2)
End If
strIn = strOut
ConvISO8859 = Replace(strOut, "=?iso-8859-1?B?6Q==?=", "é")

'Exit Function
ErrConvISO8859:
ConvISO8859 = ConvAccents(strIn)
If Right$(ConvISO8859, 2) = "?=" Then ConvISO8859 =
Left$(ConvISO8859, Len(ConvISO8859) - 2)
End Function

Function localConvISO8859(strIn As String) As String
Dim N As Integer
Dim strOut As String, strTmp As String
On Error Resume Next
strIn = Replace(strIn, "?= ", "")
If strIn = "6Q==" Then
localConvISO8859 = "é"
Exit Function
End If
localConvISO8859 = ConvAccents(strIn)
End Function

Public Function ConvAccents(strIn As String) As String
On Error GoTo ErrConvAccents
strIn = Replace(strIn, "_?= ", "")
For N = 1 To Len(strIn) - 2
Select Case Mid$(strIn, N, 1)
Case "="
If Mid$(strIn, N + 1, 2) <> " " Then
strTmp = "&h" + Mid$(strIn, N + 1, 2)
strOut = strOut + Chr$(strTmp)
End If
N = N + 2
Case "_"
strOut = strOut + " "
Case Else
strOut = strOut + Mid$(strIn, N, 1)
End Select
Next
If Mid$(strIn, N - 3, 1) <> "=" Then
strOut = strOut + Right$(strIn, 2)
Else
'strOut = strOut + Right$(strIn, 1)
End If
ConvAccents = strOut
Exit Function
ErrConvAccents:
ConvAccents = strIn
End Function


Function ConvISO8859B(strIn As String, Optional bConv As Variant) As String
Dim N As Integer, intPrec As Integer
Dim strRepereGauche As String, strRepereDroit As String
Dim strOut As String, strTmp As String

If IsMissing(bConv) Then bConv = True
If InStr(strIn, "=?iso-8859-1?B?") > 0 Then strRepereGauche =
"=?iso-8859-1?B?"
If InStr(strIn, "=?windows-1256?Q?") > 0 Then strRepereGauche =
"=?windows-1256?Q?"
strRepereDroit = "?="
N = 1
N = InStr(N, strIn, strRepereGauche, vbTextCompare)
If N = 0 Then
ConvISO8859B = strIn
Exit Function
End If
intPrec = N - 1 + Len(strRepereGauche)
strOut = Left$(strIn, N - 1)
While N > 0
N = InStr(intPrec + 1, strIn, strRepereDroit)
strTmp = Mid$(strIn, intPrec + 1, N - intPrec - 1)
strOut = strOut + IIf(bConv, localConvISO8859(strTmp), strTmp)
N = InStr(N + 1, strIn, strRepereGauche, vbTextCompare) - 1
intPosGauche = intPrec + Len(strTmp) + 1 + Len(strRepereDroit)
intLongueur = N + 1 - intPosGauche
If intLongueur > 0 Then strOut = strOut + Mid$(strIn, intPosGauche,
intLongueur)
intPrec = N + Len(strRepereGauche)
Wend
ConvISO8859B = strOut
End Function


Public Function ConvURL(strIn As String) As String
Dim N As Integer, M As Integer, DebutHTML As Integer, FinHTML As Integer
If Len(strIn) < 8 Then
ConvURL = strIn
Exit Function
End If
For N = 1 To Len(strIn) - 7
If Mid$(strIn, N, 7) = "http://" And imgStr(strIn, N) = False Then
DebutHTML = N
For M = DebutHTML To Len(strIn)
If Mid$(strIn, M, 1) = " " Then
FinHTML = M
M = Len(strIn)
End If
Next
End If
If FinHTML > 0 Then N = Len(strIn) - 7
Next
If DebutHTML > 0 Then
If FinHTML = 0 Then FinHTML = Len(strIn) + 1
strAdresse = Mid$(strIn, DebutHTML, FinHTML - DebutHTML)
ConvURL = Left$(strIn, DebutHTML - 1) + "<A HREF=" + strAdresse +
">" + strAdresse + "</A> " + Right$(strIn, Len(strIn) - FinHTML + 1)
Else
ConvURL = strIn
End If
End Function

Ce qui donne
En entrée :
Subject: =?iso-8859-1?Q?Fw:__Et_là_ça_a_marché_???? En sortie :
Subject: Fw: Et là ça a marché ???

Jean-Marc a écrit, le 08/10/2005 13:56 :
Hello,

Il faudrait en dire un peu plus sur ta moulinette,
car décoder de l'iso8859 sur un petit nombre
de caractères (quelques lignes de nom, adresses, sujet)
ne peut pas être lent, même avec une méthode bestiale.

Es tu sur que la "lenteur" de ton soft vient de ton décodage?
Si oui, quelle méthode utilises tu ?

Peux tu en plus donner un petit exemple du genre:
AVANT/APRES



Avatar
Gloops
C'est vrai que le chargement du module prend un peu de temps, déjà, à la
base. Il faut que je creuse encore un peu aussi à ce niveau-là.
________________________________________
Jean-Marc a écrit, le 08/10/2005 13:56 :

Hello,

Il faudrait en dire un peu plus sur ta moulinette,
car décoder de l'iso8859 sur un petit nombre
de caractères (quelques lignes de nom, adresses, sujet)
ne peut pas être lent, même avec une méthode bestiale.

Es tu sur que la "lenteur" de ton soft vient de ton décodage?
Si oui, quelle méthode utilises tu ?

Peux tu en plus donner un petit exemple du genre:
AVANT/APRES



Avatar
Jean-Marc
"Gloops" a écrit dans le message de
news:4347b9f9$0$987$
C'est vrai que le chargement du module prend un peu de temps, déjà, à la
base. Il faut que je creuse encore un peu aussi à ce niveau-là.




Hello,

je regarde tout ça, je mesure et je te dis :-)

--
Jean-marc
Tester mon serveur (VB6) => http://myjmnhome.dyndns.org
"There are only 10 kind of people
those who understand binary and those who don't."
mailto: remove '_no_spam_' ;
Avatar
Jean-Marc
"Gloops" a écrit dans le message de
news:4347b9f9$0$987$
C'est vrai que le chargement du module prend un peu de temps, déjà, à la
base. Il faut que je creuse encore un peu aussi à ce niveau-là.



Hello,

voila j'ai mesuré, et c'est comme je pensais;

J'ai testé avec en entrée ceci:

Subject: =?iso-8859-1?Q?j'ai_essayé_ici_
d'écrire_un_truc_plein_de_caractères_
étranges_où_les_prénoms_à_cédilles_
tels_françois_ne_manquent_pas_et_en_plus_
anormalement_long_avec_de_'!'_et_des_'?'_
à_en_être_malade_:-))?
Voici la sortie:

Subject: j'ai essayé ici d'écrire un truc
plein de caractères étranges où les prénoms
à cédilles tels françois ne manquent pas
et en plus anormalement long avec de '!'
et des '?' à en être malade :-))

Et maintenant les mesures:
J'ai effectué 10 séries de mesures avec à chaque fois une
boucle de 10.000 conversions. Les temps sont stables, et
le temps total de la boucle est négligeable (1e-8 seconde).

NOTE: j'ai fait tout ça dans l'IDE, on irait surement bien
plus vite en compilé, mais nous verrons plus loin que ça
importe peu ici.

Voici les résultats: pour une conversion de mon grand sujet,
le temps est de 0.00023 secondes, soit 2 dix-millièmes de
seconde, soit 0,2 millisecondes.

Imaginons que tu ais à chaque fois 100 nouveaux messages,
on obtient 100 * 0.00023 = 0.023 secondes = 23 millisecondes.

Imaginons encore que ta machine soit 10 fois plus lente que
la mienne (très improbable, sinon impossible, mais bon) on
obtient alors 0.23 secondes pour 100 messages, c'est à dire
230 millisecondes, plus ou moins 1/5ème de secondes. On est
à la limite de ce qui est perceptible par un humain.

On est bien d'accord que j'ai pris des hyppothèses vraiment
graves (sujet du mail immense, 100 messages à chaque fois,
une machine très très très lente, et le tout dans l'IDE).

Conclusion:
- Optimiser est tout à fait inutile dans ce cas
- Si lenteur il y a, ce n'est pas du aux conversions iso-8859.

Pour la petite histoire, on pourrait optimiser qaund même ton
code pour aller environ 5 fois plus vite, mais quel intérêt ??

--
Jean-marc
Tester mon serveur (VB6) => http://myjmnhome.dyndns.org
"There are only 10 kind of people
those who understand binary and those who don't."
mailto: remove '_no_spam_' ;
Avatar
Jacques93
Bonjour Gloops,
Gloops a écrit :
Bonjour tout le monde,

Pour convertir des caractères ISO8859 (et consor), que connaissez-vous
de plus efficace ? La taille prise en mémoire semble importante.

Voilà ce que j'ai derrière la tête : j'ai écrit un petit client mail
pour savoir rapidement si j'ai reçu des mails, sans avoir à charger
Eudora ou Mozilla. Mais voilà, ça ne me plaisait pas du tout du tout de
voir dans les sujets des messages, voire les noms des expéditeurs, des
décorations du genre ISO8859-1?=?, alors j'ai écrit ma moulinette pour
décoder tout ça, à force d'en ajouter ça finit par être assez efficace,
seulement d'un autre côté, à force d'en ajouter il faut y mettre de la
bonne volonté pour dire que ça se charge plus vite que Eudora ou Mozilla.

J'aurais cru que les "grands" logiciels de mails étaient lourds surtout
parce qu'ils gèrent des fichiers et des capacités de tri, ce dont on n'a
rien à faire dans un client "léger", mais apparemment, le décodage des
caractères accentués prend une importance que j'avais sous-évaluée.

Je n'ai rien vu de tout prêt dans les API, mais peut-être ma doc
n'est-elle pas complète ?




Sans parler de performance, Jean-Marc t'ayant répondu sur ce point, tu
peux peut être trouver des infos complémentaires en recherchant :

iconv, iconv.dll,

sur google.

--
Cordialement,

Jacques.
Avatar
Gloops
A la réflexion maintenant que vous le dites, c'est au départ qu'il y a
un délai, on arrive très rapidement à savoir le nombre de messages sur
le serveur, mais ensuite, avant de lire le premier il faut bien attendre
une quinzaine de secondes. Ensuite, une fois que c'est fait le délai
pour les suivants est acceptable.
Avatar
Jean-Marc
"Gloops" a écrit dans le message de
news:4347f41e$0$1000$
A la réflexion maintenant que vous le dites, c'est au départ qu'il y a
un délai, on arrive très rapidement à savoir le nombre de messages sur
le serveur, mais ensuite, avant de lire le premier il faut bien attendre
une quinzaine de secondes. Ensuite, une fois que c'est fait le délai
pour les suivants est acceptable.



Hello,

je ne sais pas comment tu as programmé ton petit client.
Si tu le fais avec juste un socket et POP3, ça peut être
rapide ou lent, ça ne dépend que de la vitesse du serveur POP3
que tu interroges.

J'ai écrit un programme qui fait la même chose, quand le serveur
POP3 est libre, Ca prend environ 2 secondes pour se connecter,
récupérer le nombre de nouveaux messages et afficher le sujet et
les entêtes des messages (pour 5 ou 6 messages).

Sur mon serveur habituel (tiscali.be), l'authentification est très
rapide (USER XXX PASS YYY), il répond en 1 ou 2 secondes. Sur un serveur
Yahoo, c'est beaucoup plus lent, parfois jusqu'à 5 ou 6 secondes, juste
pour négocier la connexion.

En revanche, les RETR sont en général très rapides.

J'avais posté ici le code de ce petit (le programme fait 65 lignes)
client...

Si ça intéresse qqun, je peux le remettre.

--
Jean-marc
Tester mon serveur (VB6) => http://myjmnhome.dyndns.org
"There are only 10 kind of people
those who understand binary and those who don't."
mailto: remove '_no_spam_' ;
Avatar
Gloops
Oh ben si c'est 65 lignes, ça ne mange pas de pain ...

En fait, j'ai du code dans un formulaire, et du code dans un module.
Tant que ça se passe dans le formulaire ça va assez vite, mais le module
prend du temps à se charger. Une fois qu'il est chargé le délai est de
nouveau potable.

En plus des fonctions de conversion, le module contient une procédure de
traitement de message, qui extrait les différents champs de chaque
message (sujet, date, expéditeur ...).

Je crois qu'il va falloir que je passe un peu de temps à cogiter
là-dessus et puis ensuite que je vous en redise un peu plus.


________________________________________
Jean-Marc a écrit, le 08/10/2005 18:56 :
Hello,

je ne sais pas comment tu as programmé ton petit client.
Si tu le fais avec juste un socket et POP3, ça peut être
rapide ou lent, ça ne dépend que de la vitesse du serveur POP3
que tu interroges.

J'ai écrit un programme qui fait la même chose, quand le serveur
POP3 est libre, Ca prend environ 2 secondes pour se connecter,
récupérer le nombre de nouveaux messages et afficher le sujet et
les entêtes des messages (pour 5 ou 6 messages).

Sur mon serveur habituel (tiscali.be), l'authentification est très
rapide (USER XXX PASS YYY), il répond en 1 ou 2 secondes. Sur un serveur
Yahoo, c'est beaucoup plus lent, parfois jusqu'à 5 ou 6 secondes, juste
pour négocier la connexion.

En revanche, les RETR sont en général très rapides.

J'avais posté ici le code de ce petit (le programme fait 65 lignes)
client...

Si ça intéresse qqun, je peux le remettre.



Avatar
Jean-Marc
"Gloops" a écrit dans le message de
news:4347fead$0$7859$

Hello,

Oh ben si c'est 65 lignes, ça ne mange pas de pain ...



voici:
http://myjmnhome.dyndns.org/download.htm

En fait, j'ai du code dans un formulaire, et du code dans un module.
Tant que ça se passe dans le formulaire ça va assez vite, mais le module
prend du temps à se charger. Une fois qu'il est chargé le délai est de
nouveau potable.



A voir ..

En plus des fonctions de conversion, le module contient une procédure de
traitement de message, qui extrait les différents champs de chaque
message (sujet, date, expéditeur ...).

Je crois qu'il va falloir que je passe un peu de temps à cogiter
là-dessus et puis ensuite que je vous en redise un peu plus.



Bonnes investigations!

--
Jean-marc
Tester mon serveur (VB6) => http://myjmnhome.dyndns.org
"There are only 10 kind of people
those who understand binary and those who don't."
mailto: remove '_no_spam_' ;
1 2