Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

QUOTED PRINTABLE VERSION AMÉLIORÉ


Information sur la source

Catégorie :Texte Source .NET ( DotNet ) Classé sous : quotedprintable, quoted, decode Niveau : Débutant Date de création : 05/09/2006 Date de mise à jour : 21/10/2006 18:05:03 Vu : 5 156

Note :
Aucune note

Commentaire sur cette source (7)
Ajouter un commentaire et/ou une note

Description

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

  • '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
'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

Historique

27 septembre 2006 23:44:33 :
remplacement de mid par substring et len par length et l'opérateur & par string.concat
21 octobre 2006 18:05:04 :
Amélioration et portabilité

Commentaires et avis

signaler à un administrateur
Commentaire de FREMYCOMPANY le 05/09/2006 16:34:56

Intéressante manière de faire...
Juste quelques détails qui permettraientt d'améliorer encore considérablement le temps d'execution (VB .Net) :

Pour les construction de chainne, mieux vaut utiliser un StringBuilder

Je proposerais aussi d'éviter les GOTO et de donner la priorité aux Continue For, ...

Le Return est toujours mieux que Nom_Function=Value

Mieux vaut utilier les fonctions String.Contains plutot que les anciennes fonction VB (plus lente)

...

CCl :
Si ce code semble bien optimisé pour VB 6, Il est franchement tout le contraire pour VB 7-8-9++ ;)



signaler à un administrateur
Commentaire de amine_hassini le 05/09/2006 16:58:25

les goto se traduisent en language machine par des "jump" donc ils ne peuvent être que rapide!

signaler à un administrateur
Commentaire de Willi le 05/09/2006 17:07:40 administrateur CS

Une mise à jour de ta 1ière source aurait suffit !!

signaler à un administrateur
Commentaire de FREMYCOMPANY le 05/09/2006 20:52:40

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 ;)

signaler à un administrateur
Commentaire de Renfield le 06/09/2006 07:50:33 administrateur CS


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

signaler à un administrateur
Commentaire de Willi le 06/09/2006 08:56:06 administrateur CS

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.

signaler à un administrateur
Commentaire de amine_hassini le 21/10/2006 18:16:14

Voilà ya plus de goto maintenant!

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Fonction DECODE d'oracle sous DB2 [ par acoue ] Bonjour,je souhaite utiliser un équivalent de la fonction DECODE d'oracle sous BD2/UDB mais je ne l'a connait pas.Si quelqu'un pouvait m'aiguiller.Au


Nos sponsors

Sondage...

CalendriCode

Janvier 2009
LMMJVSD
   1234
567891011
12131415161718
19202122232425
262728293031 

Consulter la suite du CalendriCode



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,437 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.