Quoted printable version amélioré

Soyez le premier à donner votre avis sur cette source.

Snippet vu 8 468 fois - Téléchargée 31 fois

Contenu du snippet

une version 125 fois plus rapide que l'ancienne!!!
Adaptation au jeu de caractère.
Je me suis aperçu du problème quand j'essayé de décoder email codé avec du utf-8, du coup la première version de ma fonction donnait des résultats bizarres! et la cause est le jeu de caractères!
Le code est facile à comprendre il suffit de suivre avec du pas à pas
si vous voulez un truc à décoder bah ouvrez un fichier .eml avec notepade et cherchez
Content-Transfer-Encoding="quoted-printable"
copier ce qui a en dessus oui le truc avec plein d'= ;)
suivez pas à pas et vous comprendrez.

Source / Exemple :


'mettre ca dans une module
Friend Function QuotePrintNew(ByVal brute As String, ByVal charset As String) As String
        Dim resul As String = ""
        Dim deco As System.Text.Encoding
        Try
            deco = System.Text.Encoding.GetEncoding(charset)
        Catch ex As Exception

            deco = System.Text.Encoding.GetEncoding("iso-8859-1")
        End Try

        If deco.IsSingleByte Then 'ce tupe de codage se fait -il sur 1 ou 2 bytes
            resul = LookForSimple(deco, brute) 'codage sur un byte ex blabla=57 veut dire blabla & chr(57) 
                                               'mais le résultat dépend du type de codage
        Else
            resul = LookForDouble(deco, brute) 'codage sur 2 bytes blabla=57=87
        End If

        Return resul
    End Function

Private Function LookForDouble(ByVal deco As System.Text.Encoding, ByVal brute As String) As String
        Dim i As Integer = 1
        Dim j As Integer = 0
        Dim temp As New System.Text.StringBuilder
        Dim ch As Char
        Dim table(1) As Byte
        Try
            Do While i <= brute.Length
                ch = Mid(brute, i, 1)
                If ch <> "=" Then
                    temp.Append(ch)
                    i += 1
                Else
                    If Mid(brute, i + 1, 2) <> vbCrLf Then
                        table(0) = CByte("&H" & Mid(brute, i + 1, 2))
                        i += 3
                        If Mid(brute, i, 1) = "=" Then
                            If Mid(brute, i + 1, 2) <> vbCrLf Then
                                table(1) = CByte("&H" & Mid(brute, i + 1, 2))
                                i += 3
                            Else
                                table(1) = CByte("&H" & Mid(brute, i + 4, 2))
                                i += 6
                            End If
                        End If
                        temp.Append(deco.GetString(table))
                    Else
                        temp.Append(vbCrLf)
                        i += 3
                    End If

                End If
            Loop
        Catch ex As Exception
           
        End Try
        Return temp.ToString
    End Function

Friend Function LookForSimple(ByVal deco As System.Text.Encoding, ByVal brute As String) As String
        Dim i As Integer = 1
        Dim temp As New System.Text.StringBuilder
        Dim ch As Char
        Dim table(0) As Byte
        Do While i <= brute.Length
            ch = Mid(brute, i, 1)
            If ch <> "=" Then
                temp.Append(ch)
                i += 1
            Else
                If Mid(brute, i + 1, 2) = vbCrLf Then
                    temp.Append(vbCrLf)
                    i += 3
                Else
                    table(0) = CByte("&H" & Mid(brute, i + 1, 2))
                    temp.Append(deco.GetString(table))
                    i += 3
                End If
            End If
        Loop
        Return temp.ToString
    End Function

A voir également

Ajouter un commentaire Commentaires
Messages postés
23
Date d'inscription
mardi 19 octobre 2004
Statut
Membre
Dernière intervention
16 avril 2007

Voilà ya plus de goto maintenant!
Messages postés
2375
Date d'inscription
jeudi 12 juillet 2001
Statut
Modérateur
Dernière intervention
15 décembre 2018
22
Ici les goto ne servent à rien, il est hérité des "vieux" langages" et niveau lisibilité sa fait code "spaghetti" et devient rapidement prise de tete pour ceux qui reprendront ton projet mais coté performance il me semble qu'il y ait un léger mieux.
Messages postés
17288
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
70
quoi qu'il en soit, les Goto ne servent strictement à rien ici.

le seul endroit où tu pourrais en avoir besoin de modifier ton code, c'est :

If Err.Number <> 0 Then
Err.Clear()
Else
k = k + 2
End If

en passant, une petite description de ta source serait pas du luxe
Messages postés
276
Date d'inscription
jeudi 12 janvier 2006
Statut
Membre
Dernière intervention
22 décembre 2008

Pour ce qui est du goto, il aurait de toute facon mieux valu utiliser une étiquette de ligne... La ligne 10, c'est bien relatif ;)

Et en code Managé, il me semble pas que Goto soit bien accueilli ;)
Messages postés
2375
Date d'inscription
jeudi 12 juillet 2001
Statut
Modérateur
Dernière intervention
15 décembre 2018
22
Une mise à jour de ta 1ière source aurait suffit !!
Afficher les 7 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.