Objectif "charactère" => "charactere" proprement !

broidsy Messages postés 4 Date d'inscription samedi 29 mars 2003 Statut Membre Dernière intervention 4 juillet 2006 - 25 août 2004 à 00:06
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 - 25 août 2004 à 16:13
Bonjours à tous,

Je vroudais pouvoir convertir "proprement" et rapidement des chaines comportent des caractères accentués en leur équivalent sans accent. Le but est de pouvoir insérer des données dans une base Batch 21 ainsi que la structure même de la base depuis des fichier XML. Bien qu'"officiellement" la structure peut être définit avec des accents ceci comporte des risques (cette une BDD américaine) peu répandu... Je travail sur VB6 et je n'est pas vraiment trouvé de fonction adapté ("strconv" n'a pas l'air suffisant). Je me doute que d'autre personne on du avoir des problèmes similaire, mais je n'est pas trouvé dans les forums de réponse suffisament fiable: je voudrais évité d'utilisé des association du style:

strtr($mot, "ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ", "aaaaaaaaaaaaooooooooooooeeeeeeeecciiiiiiiiuuuuuuuuynn")

Existe t'il une fonction VB, une API ou un autre moyen similaire de faire ceci. Dans la mesure du possible un exemple pourrait me faciliter la tache car je ne suis pas un expert VB.

Merci d'avance


NB: Je ne maitrise pas du tout les concepts du style Unicode, UTF-8...

8 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
25 août 2004 à 00:33
Il n'y a pas d'API prete a l'emploi pour faire cela mais c'est pas un gros travail de se faire une petite DLL en C qui te traitera ça en hyper rapide.

ciao...
BruNews, Admin CS, MVP Visual C++
0
cs_frop01 Messages postés 1352 Date d'inscription lundi 27 octobre 2003 Statut Membre Dernière intervention 19 novembre 2008 2
25 août 2004 à 00:41
exact c'est pas un gros travail

en une minute c'est fait

Function convert(mot As String, ch1 As String, ch2 As String) As String
  For i = 1 To Len(mot)
    For j = 1 To Len(ch1)
      If Mid(mot, i, 1) = Mid(ch1, j, 1) Then
        Mid(mot, i, 1) = Mid(ch2, j, 1)
      End If
    Next j
  Next i
  convert = mot
End Function


pour appeler cette fonction

text2 = convert(Trim(Text1), "ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ", "aaaaaaaaaaaaooooooooooooeeeeeeeecciiiiiiiiuuuuuuuuynn")


:-p [mailto:cyberscorp2004@msn.com MSN] :big)
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
25 août 2004 à 01:09
OK devrait fonctionner mais pour transferts de bases, risque d'y passer un sacre moment.

ciao...
BruNews, Admin CS, MVP VC++
0
cs_frop01 Messages postés 1352 Date d'inscription lundi 27 octobre 2003 Statut Membre Dernière intervention 19 novembre 2008 2
25 août 2004 à 01:13
oui c'est juste à mettre dans un formulaire ou pour tester la validité d'un champ textbox mais par pour faire un loop sur une table de dix milles records par exemple ;)

:-p [mailto:cyberscorp2004@msn.com MSN] :big)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
25 août 2004 à 08:20
voici une version un peu optimisée.... (si l'on ne veux pas utiliser la fonction Replace)

Function convert(mot As String, ch1 As String, ch2 As String) As String
    Dim i As Integer, j As Integer
    Dim L As Integer: L = Len(ch1)
    convert = mot
    Dim ch As String
    For i = 1 To Len(convert)
        ch = Mid(convert, i, 1)
        For j = 1 To L
            If 0 = StrComp(ch, Mid(ch1, j, 1)) Then
                Mid(convert, i, 1) = Mid(ch2, j, 1)
                Exit For
            End If
        Next j
    Next i
End Function


tu calcules x fois la taille de ch1
tu extrait x fois le même caractère de 'mot'
tu n'a pas déclaré ets variables -> Variant = lent
et plus grave ! tu modifies le parametre mot (passé par reference)

J'ai considéré également qu'un caractère n'avais pas a être converti plusieurs fois : d'ou le Exit For, pour ne pas tester les autres caractères de la chaine des caractères a remplacer

Amusez-vous ! ;)
Renfield - thomas_reynald@msn.com
Admin CodeS-SourceS
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
25 août 2004 à 12:38
Voici la version totalement optimisee en ASM, pas de boucle ni alloc desalloc de vb sur les chaines, simple substitution des octets par acces direct memoire. Je n'ai traite que la serie de caracteres accentues donnes plus haut.
A PRENDRE ICI:
http://brunews.free.fr/bnAccent.zip
dll (2,5 Ko) et txt avec declaration dans le zip.

Exemple d'emploi, chemin est en dur dans la declaration pour mes tests:
Option Explicit

Declare Sub bnEnleveAccents Lib "D:\bnAccent.dll" (ByVal sSrc As String)

Sub testEnleveAccents()
Dim s As String
s = "TestÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ"
bnEnleveAccents s
Debug.Print s
End Sub

ciao...
BruNews, Admin CS, MVP VC++
0
cs_frop01 Messages postés 1352 Date d'inscription lundi 27 octobre 2003 Statut Membre Dernière intervention 19 novembre 2008 2
25 août 2004 à 15:31
Moi je développe mon code ensuite je teste et si ca marche j'optimise !

Pas vous. ???

:-p [mailto:cyberscorp2004@msn.com MSN] :big)
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
25 août 2004 à 16:13
mouais....

en général, j'essaie d'appliquer quelques principes tout de même dès le premier jet...(déclaration des variables, calculs redondants, etc )

ici, qqs probleme d'algo , et on dira, quelques optimisations que l'on peut apporter par la suite....

Amusez-vous ! ;)
Renfield - thomas_reynald@msn.com
Admin CodeS-SourceS
0
Rejoignez-nous