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

VB.NET Discussion :

Comparaison insensible aux accents


Sujet :

VB.NET

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 125
    Points : 66
    Points
    66
    Par défaut Comparaison insensible aux accents
    Bonjour,

    Je cherche un moyen de comparer 2 texte, sans tenir compte de la casse et des accents.

    Il semble qu'il faille utiliser la fonction String.Compare, avec une CultureInfo.

    Mais quand j'essaye ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Imports System
    Imports System.Globalization
     
    Public Module Module1
     Public Sub Main()
      Console.WriteLine(String.Compare("Jean", "Jeàn", True, New CultureInfo("fr-FR" )))
     End Sub
    End Module
    Ca me retourne -1. Alors que je m'attends à avoir 0.
    Si je compare "Jean" avec Jexn", ça me retourne aussi -1.

    Je sais qu'il y a aussi la possibilité de remplacer toutes les lettres accentuées par leur équivalents simples.
    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
     
    Function Sans_accents(ByVal Chaine As String) As String ' R. Dezan + Michel Pierron
     
            Dim a As String
            Dim b As String
            Dim u As Integer
     
            a = "ÀÁÂÃÄÅÈÉÊËÌÍÎÏÑÒÓÔÕÖÙÚÛÜÝàáâãäåèéêëìíîïðñòóôõöùúûüýÿ"
            b = "AAAAAAEEEEIIIINOOOOOUUUUYaaaaaaeeeeiiiionooooouuuuyy"
            'Chaine = Replace(Replace(Replace(Replace(Chaine, "œ", "oe"), "Œ", "OE"), "æ", "ae"), "Æ", "AE")
            For i = 1 To Len(Chaine)
                u = InStr(1, a, Mid(Chaine, i, 1), 0)
                If u > 0 Then Mid(Chaine, i, 1) = Mid(b, u, 1)
            Next i
            Sans_accents = Chaine
        End Function
    Mais je voudrais trouver une solution un peu plus "propre".

    Merci d'avance pour votre aide.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Function Sans_accents(ByVal Chaine As String) As String
    Dim a As String= "ÀÁÂÃÄÅÈÉÊËÌÍÎÏÑÒÓÔÕÖÙÚÛÜÝàáâãäåèéêëìíîïðñòóôõöùúûüýÿ"
    Dim b As String="AAAAAAEEEEIIIINOOOOOUUUUYaaaaaaeeeeiiiionooooouuuuyy"
    Dim T As String=Chaine
    For i as Integer  = 1 To T.Count - 1
        T = T.Replace(a.Substring(i, 1), b.Substring(i, 1)).ToUpper
    Next i
    return T
        End Function
    tu peux t'intéresser également aux expression régulières!

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 125
    Points : 66
    Points
    66
    Par défaut
    Bonjour disotrhogarphie,

    Merci pour la réponse.

    Mais ma question concerte surtout pourquoi le code suivant :
    Console.WriteLine(String.Compare("Jean", "Jeàn", True, New CultureInfo("fr-FR" )))
    ne marche pas, alors que d'après la doc, ça devrait marcher.
    https://msdn.microsoft.com/en-us/lib...v=vs.110).aspx

    Hum ....
    En fait, je crois comprendre, mais c'est un peu particulier.
    Console.WriteLine(String.Compare("Jean", "Jeàn", True, New CultureInfo("fr-FR")))
    Résultat = -1

    Console.WriteLine(String.Compare("Jeàn", "Jean", True, New CultureInfo("fr-FR")))
    Résultat = 1

    La doc indique :
    Value _________Condition
    Less than zero____strA precedes strB in the sort order.
    Zero____________strA occurs in the same position as strB in the sort order.
    Greater than zero__strA follows strB in the sort order.

    Donc, VB.NET compare l'ordre de "a" et "à". Et pour lui, ce ne sont pas des lettres avec le même ordre.

    Si le seul cas pour lequel String.Compare retourne la valeur 0, c'est quand les 2 textes sont parfaitement identiques (modulo la casse), je ne vois pas trop l'intérêt de la fonction.

    Pourquoi c'est si compliqué, alors que dans SQL Server, c'est si simple ...

    Bon, ben je crois que je vais devoir faire la méthode Replace... lettre par lettre.

    Et je me suis permis de reprendre ton 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
    imports system
     
    Public Module Module1
    	Public Sub Main()
    		Dim a As String = "ÀÁÂÃÄÅÈÉÊËÌÍÎÏÑÒÓÔÕÖÙÚÛÜÝàáâãäåèéêëìíîïðñòóôõöùúûüýÿ"
    		Dim b As String = "AAAAAAEEEEIIIINOOOOOUUUUYaaaaaaeeeeiiiionooooouuuuyy"
    		Dim T As String = "Jeàñ Hélëne Jérôme"
    		For i as Integer = 0 To a.Length - 1
    			T = T.Replace(a.Substring(i, 1), b.Substring(i, 1))
    		Next i
     
    	Console.WriteLine(T.ToUpper)
    	End Sub
    End Module

  4. #4
    Invité
    Invité(e)
    Par défaut
    Le code ascii du a est 145 et celui du A 65 , hors un ordinateur ne comprends que du binaire!

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 125
    Points : 66
    Points
    66
    Par défaut
    On dévie un peu du sujet, mais essaye d'expliquer ça à un utilisateur.
    Et autant on pouvait comprendre il y a 10-20 ans que c'était à l'utilisateur de s'adapter à l'ordinateur, maintenant, c'est l'inverse.

    Un indice chez vous :
    Sur Google, Facebook, Wikipedia, Amazon, eBay (et plein d'autres sites), les recherches sont insensibles à la casse et aux accents.

    Les utilisateurs attendent donc maintenant que quand ils font une recherche, le résultat doit correspondre à ce qu'ils attendent, c-à-d sans se soucier des accents et majuscules.
    Il y aura bien sûr toujours des cas où l'on voudra que la recherche soit exacte. Mais qu'au mois, les langages de programmations donnent facilement la possibilité de choisir.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Tous les site que tu nomme on fait appel à des développeurs qui se sont pris la tête pour rendre ça possible. Un développeur est un utilisateur lambda? C'est un autre débat!

    Moi je n'aime pas laisser un logiciel décider à ma place! Le minitel était redoutable, il comprenait même mon orthographe libertaire!

  7. #7
    Membre confirmé
    Avatar de nouanda
    Homme Profil pro
    Hobbyist
    Inscrit en
    Mai 2002
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Australie

    Informations professionnelles :
    Activité : Hobbyist

    Informations forums :
    Inscription : Mai 2002
    Messages : 246
    Points : 627
    Points
    627
    Par défaut
    jjcasalo, comme tu l'as dit, le resultat depend de l'ordre dans lequel les lettres sont trouvees dans l'alphabet.
    Pour ignorer les accents, il faut utiliser une autre surcharge de string.Compare:String.Compare(String,String,CultureInfo,CompareOptions)
    La clef est le paramètre CompareOptions, que tu peux passer a CompareOptions.IgnoreNonSpace. La documentation nous dit:
    Indicates that the string comparison must ignore nonspacing combining characters, such as diacritics.
    Et bam! plus de problemes d'accents!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Console.WriteLine(String.Compare("Jean", "Jeàn", New CultureInfo("fr-FR"), CompareOptions.IgnoreNonSpace))
    Et pour ignorer la casse:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Console.WriteLine(String.Compare("JeAn", "jEàN",  New CultureInfo("fr-FR"), CompareOptions.IgnoreNonSpace Or CompareOptions.IgnoreCase)))
    " Entre le Savoir et le Pouvoir, il y a le Vouloir "

    Desole pour les accents, je suis en QWERTY...

  8. #8
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Tu mets:

    Dans l'entête de ton module. Ou bien tu le fais par défaut dans ton MyProject.

    Avec

    Les caractères accentués sont triés/comparés séparément de leur caractère non accentué

    Avec

    Les caractères accentués sont triés/comparés comme étant la même chose que leur caractère nom accentué. L'ordre exact dépend donc du premier caractère différent dans les deux mots comparés.
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

  9. #9
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Merci nouanda et Clément, je savais pas!

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 125
    Points : 66
    Points
    66
    Par défaut
    Merci beaucoup pour votre aide

  11. #11
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Bonjour

    Citation Envoyé par dysorthographie Voir le message
    Bonjour,
    Merci nouanda et Clément, je savais pas!
    En fait, même moi je n'avais jamais porté attention aux constantes de comparaison de CultureInfo de String. C'est très intéressant de le savoir.

    Et, à bien y penser, si tout le monde savait tout, il n'y aurait pas besoin d'un paquet de forums
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

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

Discussions similaires

  1. [LibreOffice][Base de données] Ecrire une requête SQL dans BASE insensible aux accents
    Par Cissy dans le forum OpenOffice & LibreOffice
    Réponses: 12
    Dernier message: 05/12/2015, 11h29
  2. Recherche insensible aux accents
    Par Warluck dans le forum Administration
    Réponses: 4
    Dernier message: 24/09/2013, 14h25
  3. Recherche insensible aux accents avec REGEXP
    Par khasyt dans le forum Requêtes
    Réponses: 7
    Dernier message: 10/08/2009, 03h17
  4. [script.aculo.us] Autocompleter insensible aux accents
    Par oceanbigone dans le forum Bibliothèques & Frameworks
    Réponses: 4
    Dernier message: 09/12/2008, 01h35
  5. Recherche insensible à la casse ET insensible aux accents.
    Par Bernard Grosdoy dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 10/07/2005, 03h32

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