IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Traitement d'une chaîne de caractère


Sujet :

C#

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 36
    Points : 25
    Points
    25
    Par défaut Traitement d'une chaîne de caractère
    Bonsoir,

    je fais actuellement un navigateur web en c# et j'ai le problème suivant : créer une recherche web si l'url rentré est invalide.
    mon problème est que mon algorithme n'a pas l'air de modifier la chaîne de caractère en effet j'ai deux modification a faire :
    - si il y a un '+' le remplacer par '%2b'
    - si il y a un espace (' ') le remplacer par un '+'

    voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
     
            public static string traitement(string address)
            {
                string Addressreturn = "";//adresse retourné
                if ((creation_d_url(address)) == true)// on valide l'url entrée (retourne un booléen)
                {
                    return address;
                }
                else
                {
     
                    TransformationAddress(address);//transforme les + en %2B
                    address.Replace(' ', '+');//remplace les espaces par des +
                    Addressreturn = "https://duckduckgo.com/?q=" + address;//concatène address avec l'url de recherche de duckduck go avec l'address
                    return Addressreturn; //renvoie l'addresse de recherche pour que le navigateur y accède 
                }
            }
            private static bool creation_d_url(string address) //fonction qui renvoie vrai ou faut en fonction du résultat du traitement
            {
                //création d'une uri a valeur "null"
                Uri CreatedUri;
                //on tente de créer l'url en vérifiant qu'elle est comforme a une url http ou https
                bool IsValid = Uri.TryCreate(address, UriKind.Absolute, out CreatedUri) && (CreatedUri.Scheme == Uri.UriSchemeHttp || CreatedUri.Scheme == Uri.UriSchemeHttps);
                if ((address == "") || (!IsValid))
                {
                    return false;
                }
                else
                {
                    return true;
                }
            }
            private static string TransformationAddress (string address)
            {
                List<char> result = new List<char>();
                int LongueurAddress = address.Length;
                foreach (char element in address)
                {
                    if ((element == '+') && (LongueurAddress > 1))
                    {
                        result.Add('%');
                        result.Add(',');
                        result.Add('2');
                        result.Add(',');
                        result.Add('b');
                        result.Add(',');
                    }
                    else
                    {
                        if ((element == '+') && (LongueurAddress <= 1))
                        {
                            result.Add('%');
                            result.Add(',');
                            result.Add('2');
                            result.Add(',');
                            result.Add('b');
                        }
                        else
                        {
                            if (LongueurAddress > 1)
                            {
                                result.Add(element);
                                result.Add(',');
                            }
                            else
                            {
                                result.Add(element);
                            }
                        }
                    }
     
                    LongueurAddress -= 1;
     
                }
                address = result.ToString();
                return address;
            }
     
        }
    le problème :
    si je rentre 1+1 il me renvoie https://duckduckgo.com/?q=1+1 ce qui fais comme si je cherchais "1 1"

    merci d'avance a ceux qui pourront m'aider

  2. #2
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    Salut,

    ta méthode me parait particulièrement compliquée.
    Ne serait-il pas plus simple de faire un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    chaineATraiter = chaineATraiter.Replace("+", "%2b").Replace(' ', '+');
    // "A+B C" > "A%2bB+C"
    // "A B+C D" > "A+B%2bC+D"
    Bon dev.
    Plus je connais de langages, plus j'aime le C.

  3. #3
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    On peut même faire encore plus simple, il s'agit juste d'encoder l'URL. On peut donc utiliser les méthodes WebUtility.UrlEncode et WebUtility.UrlDecode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var originalInput = "1+1";
    var encoded = System.Net.WebUtility.UrlEncode(originalInput);
    // Résultat : 1%2b1
     
    var decoded = System.Net.WebUtility.UrlDecode(encoded);
    // Résultat : 1+1
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 36
    Points : 25
    Points
    25
    Par défaut
    Salut,

    La méthode que tu propose marche très bien jopopmk et c'est d'une simplicité déconcertante

    DotNetMatt je n'ai pas réussi a faire fonctionner ta solution et je n'arrive pas a la comprendre pourrait-tu expliquer ?

  5. #5
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    Petite explication sur la méthode de DotNetMatt : il faut savoir qu'un URL est normalement écrite en ASCII, un ensemble de caractères (charset) très réduit ne contenant pas, par exemple, les accents. De plus certains caractères dans une URL ont un signification particulière (ex. : le '&' qui introduit un nouveau paramètre GET). Ça fait pas mal de caractères à échapper au final. Du coup la plupart des langages proposent des fonctionnalités permettant de gérer cet encodage vers une forme "URL proof" et un décodage pour retrouver la forme originale.

    Pour utiliser les fonctions présentées par DotNetMatt il faut faire un using de System.Net et les appeler depuis WebUtility. Server est un objet global qui ne doit être dispo que sur un projet ASP.NET (à confirmer).

    Bon dev.

    edit : suppression d'une ânerie.
    Plus je connais de langages, plus j'aime le C.

  6. #6
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Merci jopopmk pour l'explication claire

    Citation Envoyé par jopopmk Voir le message
    Pour utiliser les fonctions présentées par DotNetMatt il faut faire un using de System.Net et les appeler depuis WebUtility. Server est un objet global qui ne doit être dispo que sur un projet ASP.NET (à confirmer).
    Arf, oui je confirme ! Au début j'ai mis le code avec Server et puis je me suis rappelé que System.Net possédait une classe WebUtility donc j'ai mis à jour les liens, mais pas le code Donc Server est dispo en ASP.NET avec la DLL System.Web. Pour d'autres types de projet (console ou autre), il vaut mieux utiliser WebUtility dispo avec la DLL System.Net. J'ai mis le code à jour.

    Citation Envoyé par jopopmk Voir le message
    Enfin, ton encodage diffère un peu de l'encodage commun des URL. Cette méthode n'est donc peut-être pas celle que tu recherches.
    Juste pour bien comprendre, qu'est-ce qui te fais dire ca ? En principe il n'y a qu'une seule facon d'encoder une URL et elle est déterminée par le protocole HTTP (heureusement, sinon les navigateurs ne s'y retrouveraient pas).
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  7. #7
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    Citation Envoyé par DotNetMatt Voir le message
    [..] Juste pour bien comprendre, qu'est-ce qui te fais dire ca ? En principe il n'y a qu'une seule facon d'encoder une URL et elle est déterminée par le protocole HTTP (heureusement, sinon les navigateurs ne s'y retrouveraient pas).
    Mon erreur, je pensais que tous les caractères échappés étaient remplacés par leur code hexa (une espace serait transformée en %20 et non en '+'). Donc effectivement, cette méthode est bien plus intéressante : pour l'instant kormedhar veut juste transformer les espaces et les '+', mais demain il voudra sûrement gérer d'autres caractères à échapper.
    Plus je connais de langages, plus j'aime le C.

  8. #8
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 743
    Points
    9 743
    Billets dans le blog
    3
    Par défaut
    Ok, en fait pour être plus précis, le "+" dans les URL n'est valide que pour le type de contenu application/x-www-form-urlencoded :
    http://www.example.com/path/foo+bar/path?query+name=query+value
    Dans cet exemple, en réalité on a "query name" et "query value", mais le nom du dossier est réellement "foo+bar" (et non "foo bar").

    Ceci est défini dans les spécifications HTML (et non HTTP comme j'ai pu l'écrire plus haut).

    Utiliser %20 permet d'indiquer un espace dans tous les cas de figure, donc c'est bien plus safe.

    Certains navigateurs essaient de rendre les URL lisibles donc ils peuvent modifier l'URL pour l'affichage, mais en réalité derrière ils utilisent bien les codes d'échappement. Aussi d'après ce que j'ai pu lire sur le lien ci-dessous, dans certains langages comme PHP et Javascript, il y a des méthodes qui ne respectent pas totalement ces règles.

    Pour un peu plus d'info et retrouver les explications originales autour de cet exemple, voir la réponse sur cette discussion.
    Less Is More
    Pensez à utiliser les boutons , et les balises code
    Desole pour l'absence d'accents, clavier US oblige
    Celui qui pense qu'un professionnel coute cher n'a aucune idee de ce que peut lui couter un incompetent.

  9. #9
    Membre expert Avatar de jopopmk
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    1 856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 1 856
    Points : 3 570
    Points
    3 570
    Par défaut
    Merci pour ces informations complémentaires
    Plus je connais de langages, plus j'aime le C.

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2015
    Messages : 36
    Points : 25
    Points
    25
    Par défaut
    Merci beaucoup pour toutes ces explications en effet j'avais commencé avec les '+' car c'est ce qui ne marchait pas quand j'ai testé de créer des URL de recherche mais j'aurais été confronté aux autres problématique plus tard, je ne savait pas que les urls était écrite en ASCII mais ça explique pas mal de chose (à quand le support de l'utf-8 ? ^^)
    vous m'avez beaucoup appris et je vous en remercie
    j'ai choisis la solutions de DotNetMatt pour mes URL de recherche mais je garde celle de jopopmk pour le traitement de chaîne de caractère car je la connaissais pas

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Traitement d'une chaîne de caractère
    Par joffrey575 dans le forum C++
    Réponses: 3
    Dernier message: 16/04/2015, 09h12
  2. Réponses: 8
    Dernier message: 12/02/2013, 01h08
  3. [RegEx] Traitement d'une chaîne de caractères
    Par Youn05 dans le forum Langage
    Réponses: 4
    Dernier message: 01/04/2007, 12h18
  4. Réponses: 3
    Dernier message: 09/05/2002, 01h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo