Problème -> accents dans les fonctions de chaînes

SgtDak Messages postés 3 Date d'inscription lundi 5 mai 2003 Statut Membre Dernière intervention 7 mai 2003 - 5 mai 2003 à 23:04
SgtDak Messages postés 3 Date d'inscription lundi 5 mai 2003 Statut Membre Dernière intervention 7 mai 2003 - 7 mai 2003 à 18:41
Bien le bonjour, messieurs/dames

Voici un petit problème que j'ai pour coder une page en ASP (VBScript, pas .NET)

Je récupère dans une base de données des titres de films, afin de référencer des commentaires et autres critiques (site de critique de films, donc beaucoup de films...)

Le problème vient bien entendu des accents, car comme chacun le sait, les langages de programmation ne sont pas faits pour nous, pauvres français.

Pour la requête SQL, j'ai finalement trouvé, ayant remarqué que nombreux sont les gens qui cherchent à faire des requêtes "accent-insensitive", voici ma requête SQL :
SELECT num, country, year, originalTitle, translatedTitle, CAST(category AS varchar(255)) AS cat FROM movielist WHERE CAST(translatedTitle AS varchar(255)) COLLATE SQL_Latin1_General_CP437_CI_AI LIKE '%" & strElem & "%' ORDER BY cat;
L'astuce est valable uniquement pour SQL Server (2000 au moins) et réside dans la fonction système "COLLATE" suivie de cette chaîne horrible qui permet une recherche insensible à la casse et insensible aux accents.

Maintenant que ce problème est résolu, je voudrai que ma page de résultat surligne les mots de la recherche dans le texte et pour cela, mon texte est contenu dans une variable et je remplace les mots recherchés par le même mot entourés de balises faisant référence à une feuille de style CSS (enfin bon, c'est pas ca l'important).

Mais, les fonction InStr(str) et Replace(str) me permette seulement deux options, la comparaison binaire sensible à toutes les différences, et la comparaison textuelle qui est insensible à la casse mais sensible aux accents...

Existe-t-il une fonction ou quelque chose me permettant le miracle d'une comparaison plus libre insensible aux accents ? Dois-je la coder à la main ? Et si seule cette solution existe, quelqu'un a-t-il déjà exécuté cette pirouette et me ferait gagner quelques heures (au bas mot) ?

Merci
@+

1 réponse

SgtDak Messages postés 3 Date d'inscription lundi 5 mai 2003 Statut Membre Dernière intervention 7 mai 2003
7 mai 2003 à 18:41
Salut,

bon alors il me semble qu'il n'existe aucune solution réellement simple à mon problème, j'ai donc coder une fonction qui résoud mon problème, comme certains pourraient être intéressés, je poste ici mon explication :

Tout d'abord, je vérifie que la chaîne de recherche exacte n'est pas dans le texte.
Si ce n'est pas le cas, je remplace tous les caractères accentués de la chaîne de recherche et du texte en utilisant des variables temporaires. Ainsi, leur longueur ne change pas.
Si je trouve la chaîne non-accentuée dans le texte de base, j'utilise sa position pour remplacer dans mon texte d'origine (avec les accents) les parties correspondantes.

Voici la fonction que j'utilise :
' ==========================================
' Fonction permettant de remplacer des mots dans un texte par ces mots surligné
' strText est le texte dans lequel on cherche ces mots
' arrCrit est un tableau contenant les mots à rechercher
Function strReplaceText(strText, arrCrit)
' Déclaration des variables
Dim strElem
Dim strElem2
Dim strTemp
Dim strTemp2
Dim intPos
' Initialisation des variables
strTemp = strText
' On parcourt le tableau d'éléments
For Each strElem In arrCrit
If InStr(1, strTemp, strElem, vbTextCompare) > 0 Then
strTemp = Replace(strTemp, strElem, "" _
& Mid(strTemp, InStr(1, strTemp, strElem, vbTextCompare), Len(strElem)) & "", 1, Len(strTemp), vbTextCompare)
Else
strTemp2 = strTemp
strElem2 = strElem
strTemp2 = Replace(strTemp2, "é", "e", 1, Len(strTemp2), vbTextCompare)
strTemp2 = Replace(strTemp2, "è", "e", 1, Len(strTemp2), vbTextCompare)
strTemp2 = Replace(strTemp2, "ê", "e", 1, Len(strTemp2), vbTextCompare)
strTemp2 = Replace(strTemp2, "ë", "e", 1, Len(strTemp2), vbTextCompare)
strTemp2 = Replace(strTemp2, "à", "a", 1, Len(strTemp2), vbTextCompare)
strTemp2 = Replace(strTemp2, "â", "a", 1, Len(strTemp2), vbTextCompare)
strTemp2 = Replace(strTemp2, "ä", "a", 1, Len(strTemp2), vbTextCompare)
strTemp2 = Replace(strTemp2, "î", "i", 1, Len(strTemp2), vbTextCompare)
strTemp2 = Replace(strTemp2, "ï", "i", 1, Len(strTemp2), vbTextCompare)
strTemp2 = Replace(strTemp2, "ô", "o", 1, Len(strTemp2), vbTextCompare)
strTemp2 = Replace(strTemp2, "ö", "o", 1, Len(strTemp2), vbTextCompare)
strTemp2 = Replace(strTemp2, "ù", "u", 1, Len(strTemp2), vbTextCompare)
strTemp2 = Replace(strTemp2, "û", "u", 1, Len(strTemp2), vbTextCompare)
strTemp2 = Replace(strTemp2, "ü", "u", 1, Len(strTemp2), vbTextCompare)
strElem2 = Replace(strElem2, "é", "e", 1, Len(strElem2), vbTextCompare)
strElem2 = Replace(strElem2, "è", "e", 1, Len(strElem2), vbTextCompare)
strElem2 = Replace(strElem2, "ê", "e", 1, Len(strElem2), vbTextCompare)
strElem2 = Replace(strElem2, "ë", "e", 1, Len(strElem2), vbTextCompare)
strElem2 = Replace(strElem2, "à", "a", 1, Len(strElem2), vbTextCompare)
strElem2 = Replace(strElem2, "â", "a", 1, Len(strElem2), vbTextCompare)
strElem2 = Replace(strElem2, "ä", "a", 1, Len(strElem2), vbTextCompare)
strElem2 = Replace(strElem2, "î", "i", 1, Len(strElem2), vbTextCompare)
strElem2 = Replace(strElem2, "ï", "i", 1, Len(strElem2), vbTextCompare)
strElem2 = Replace(strElem2, "ô", "o", 1, Len(strElem2), vbTextCompare)
strElem2 = Replace(strElem2, "ö", "o", 1, Len(strElem2), vbTextCompare)
strElem2 = Replace(strElem2, "ù", "u", 1, Len(strElem2), vbTextCompare)
strElem2 = Replace(strElem2, "û", "u", 1, Len(strElem2), vbTextCompare)
strElem2 = Replace(strElem2, "ü", "u", 1, Len(strElem2), vbTextCompare)

intPos = InStr(1, strTemp2, strElem2, vbTextCompare)
If intPos > 0 Then
strTemp = Left(strTemp, intPos - 1) & "" & Mid(strTemp, intPos, Len(strElem)) & "" & Right(strTemp, Len(strTemp) - Len(strElem) - intPos + 1)
End If
End If
Next
strReplaceText = strTemp
End Function
' ==========================================
0
Rejoignez-nous