WIKI LWS - L'hébergeur Web accessible à tous WIKI LWS - L'hébergeur Web accessible à tous

Ceci est une ancienne révision du document !


Techniques multilingues pour travailler avec des bases de données

Structure de la base de données

Avant de modéliser la base de données, vous devez réfléchir: voulez-vous privilégier la vitesse ou l'espace?

  • La solution du gain d'espace serait de comparer le mot demandé avec toutes les combinaisons possibles d'un mot, en prenant en considération les caractères qui peuvent être accentués.

Par exemple, si un utilisateur soumet "Réjean" comme mot-clé, le script devrait chercher "Rejean", "Réjean", "Rejèan" … - jusqu'à ce qu'il trouve un résultat convenable ou qu'il épuise toutes les possibilités (qui sont presque infinies). A condition que vous n'ayez besoin de créer des tables ou champs additionnels, cela semble "fou" étant donné que l'espace mémoire est chère et que les bases de données sont plus robustes de nos jours. Je conseille fortement de ne pas utiliser cette méthode.

  • La solution qui privilégie la vitesse serait de stocker un champ ou une table additionnels dans la base de données avec le nom particulier / mot "déshabillé" des ses accents. Il y a 2 moyens faisables pour le mettre en application:

Ajouter un extra champ

Cette méthode consiste à ajouter un extra champ à une table existante qui contiendra la version "déshabillée" du nom. Par exemple, la table suivante Entry(EID, Fname, Lname, PhoneNum) deviendra Entry(EID, Fname, Fname2, Lname, Lname2, PhoneNum) où Fname2 et Lname2 sont les versions "déshabillées" des champs avec les noms similaires (pas d'accents).

Table Entry

EID Fname Fname2 Lname Lname2 PhoneNum 3 Pierre Pierre Côté Cote 452-4252 4 Réjean Rejean Préçus Precus 863-5218

Ces 2 champs seront ensuite indexés (en permettant la duplication), ainsi la recherche les utilisera. Comment fonctionne la requête: l'utilisateur soumet un mot-clé particulier qui est "déshabillé" de ses accents. Une recherche ensuite est exécutée en comparant celui-ci avec les champs "déshabillés" (Fname2 / Lname2). Si celui-ci est trouvé alors, le champ avec les accents sera retourné et affiché à l'utilisateur. La réalisation sera plus approfondie plus loin dans l'article.

Cette méthode fonctionne bien mais gardez en mémoire qu'il y a une quantité considérable de redondances dans la table étudiée (bien que cela soit contrôlé). Lisez les articles sur "Data Modeling" sur le site de 4GuysFromRolla pour plus d'information

Ajoutez une extra table

Cette méthode consiste à ajouter une table qui évite le double stockage des noms en utilisant la méthode du "mapping": chaque nom avec accents auront son nom correspondant sans accents. Voici la nouvelle table: MappedNames (AccentedName (PK), AccentlessName). Seuls les noms avec accents apparaîtront dans cette table; les premiers et les derniers noms peuvent être "mappés" en utilisant les mêmes champs.

Table Entry

EID Fname Lname PhoneNum 3 Pierre Côté 452-4252 4 Réjean Préçus 863-5218

Table MappedNames

AccentedName AccentlessName

Côte Cote

Réjean Rejean

Préçus Precus

Une étape SELECT pour s'informer sur un nom sera prévue comme suit:

PARAMETER queryname: Text; SELECT Entry.Fname, Entry.Lname, Entry.PhoneNum FROM Entry INNER JOIN MappedNames ON Entry.Lname = MappedNames.AccentedName WHERE Entry.Lname = queryname OR MappedNames.AccentlessName = queryname;

Le paramètre queryname sera naturellement "déshabillé" de ses accents avant d'être utilisé dans la requête. Cette méthode évite la redondance des noms communs qui sont stockés à de multiples temps et le cas où les premiers noms peuvent aussi être les derniers. Les deux méthodes varient en complexité mais accomplissent la même tâche avec une efficience similaire.

Réalisation

Pour clarifier et facilité la compréhension, je vais illustrer la réalisation en utilisant la méthode extra champ. Le concept s'applique à toute autre méthode.

Modélisation des données

La première étape est de créer les champs "déshabillés" (ie: Fname2, Lname2), en les configurant avec "Indexé" (cela permet la duplication). C'est probablement plus facile de le faire directement dans votre base de données Microsoft Access. Ajoutez cette propriété à chaque champ qui sera utilisé pour la recherche.

Définition des données

Après, nous insérons ou mettons à jour les champs "déshabillés" en "déshabillant" les principaux champs accentués. Cela peut être fait en utilisant les fonctions suivantes et les étapes SQL:

Function Unapostrophize(theword) Unapostrophize = Replace(theword, "'", "") End Function Function StripAccents(theword) Dim letter, tempWord For i = 1 to Len(theword) letter = Mid(theword,i,1) Select case LCase(letter) case "é","è","ê","ë" letter = "e" case "à","â","å","ä" letter = "a" case "ù","û" letter = "u" case "ò","ö","ô" letter = "o" case "ç" letter = "c" case "ï","ì" letter = "i" case "ÿ" letter = "y" case "'" letter = "" '. '. Ajoutez autant de caractères que voulu '. End Select

tempWord = tempWord & letter Next

StripAccents = tempWord End Function '…

SQL = "INSERT INTO Entry (Fname, Fname2) VALUES ('" & _

Unapostrophize(theFname) & "', '" & _

StripAccents(theFname) & "')"

SQL= "UPDATE Entry SET Fname2 = '" & _

StripAccents(theFname) & _

"' WHERE EID = theEID"

La fonction Unapostrophize() double chaque apostrophe trouvée. Cela contourne le problème où SQL interprète les apostrophes comme des délimiteurs de chaîne, comme avec par exemple "D'Angelo".

La fonction StripAccents() replace toutes les lettres accentuées par des versions non-accentuées, en plus de vérifier les apostrophes.

theFname, theEID sont des variables qui ont les valeurs correctes de Fname et EID (cela implique qu'elles soient retournées par une requête).

Les champs doivent maintenant être tous remplis. Nous allons poursuivre avec la partie des requêtes.

Les requêtes:

Observez l'échantillon de programme ci-dessous en utilisant les fonctions et les concepts mentionnés ci-dessus:

qLname = Request.QueryString("lname") 

If qLname <> "" Then 

SQL = "SELECT Fname, Lname, PhoneNum FROM Entry WHERE Lname2 LIKE 

'%" & StripAccents(qLname) & "%' ORDER BY Lname" 

'Connection à la base de données 

SET DbObj = Server.CreateObject("ADODB.CONNECTION") 

DbObj.Open "DSN=phonebk;UID=;PWD=;" 

SET oRs = DbObj.Execute(SQL) 'Execute above SQL statement 

While Not oRs.EOF 

Response.Write oRs.Fields("Lname") & ", " & _ 

oRs.Fields("Fname") & _ 

" - " & oRs.Fields("PhoneNum") 

'Une ligne de "cassure" en sortie 

Response.Write "<" & "BR>" 

oRs.MoveNext 

Wend 

DbObj.Close 

SET DbObj = Nothing 

SET oRs = Nothing 

End If 

Comme vous pouvez le constater, nous "déshabillons" la requête qLname et la comparons avec le champ "déshabillé" Lname2 dans la base de données. Une fois que les 2 champs sont au même niveau, trouver le résultat ne pose plus de problèmes. Vous noterez que dans les résultats, nous sortons les champs actuels avec les accents, ainsi l'utilisateur ne se doute pas de ce qu'il se produit.

Une petite révision rapide: nous créons un champ ou une table extra contenant une version d'une chaîne sans accents. Puis nous acceptons une requête qui a été "déshabillée" de ses accents. Les résultats peuvent ensuite être trouvés. Les champs affichés ou utilisés contiendront des accents.

Seul le jeu de caractères ISO-885961 (Latin-1) est supporté par HTML. Donc, tous les autres caractères (cyrillic, asian, symboles mathématiques …). nécessitent le téléchargement additionnel de jeux de caractères pour les systèmes des utilisateurs.

Exécution

Il y a plusieurs moyens de conversion et d'affichage des caractères étrangers:

* Créer un champ séparé dans la table avec les caractères convertis.

* Créer une table séparée ( "mapper" un nom converti en son nom régulier).

* Écrire une fonction qui analyse une chaîne et convertit les caractères.

Les deux premiers moyens suivent le même principe que le "déshabillage" des accents dans mon premier article. Dans ce cas, c'est assez difficile de stocker les codes caractère HTML dans la base de données puisque certains caractères peuvent changer ou ne pas fonctionner proprement dans un certain environnement. Cela serait aussi laborieux de les changer dans toute la base de données. A la place, je suggère plutôt d'utiliser un algorithme de conversion qui convertira dynamiquement les caractères étrangers durant son lancement.

Voici la fonction:

Function ConvertCodes(str) 

Dim i, letter, temp


For i = 1 to Len(str) 

letter = Mid(str,i,1) 



If Asc(letter) > 122 Then 

temp = temp & "&#" & Asc(letter) & ";" 

Else 

temp = temp & letter 

End If 

Next 


ConvertCodes = temp 

End Function 

Cette fonction contrôle chaque caractère dans une chaîne et remplace les caractères étrangers (qui ont des valeurs numériques supérieures à 122) avec le code caractère HTML équivalent. Pour utiliser cette fonction durant le lancement, c'est simple. Les quelques lignes suivantes de code démontrent des échantillons d'utilisation:

Response.Write ConvertCodes(oRs.Fields("Lname")) _ & ", " & ConvertCodes(oRs.Fields("Fname")) _ & " - " & oRs.Fields("PhoneNum")

Comme vous vous souvenez, la base de données contient des données avec des caractères étrangers. Si nous les sortons sans les convertir, les caractères étrangers seront affichés improprement dans certains environnements, donc nous ajoutons juste la fonction ConvertCodes() aux chaînes nécessitant une conversion. A chaque occurrence où vous récupérez des sorties d'une base de données qui peuvent contenir des caractères étrangers, insérez la fonction.

Souvenez-vous, un des éléments qui fait un Webmaster professionnel est sa capacité à produire des sites Web et des contenus Web accessibles et lisibles de tous, par tous les navigateurs, les plate-formes ou localisations dans le monde.

Ressources

Guides de référence des codes caractère HTML:

  • HTML Reference Library - Inventaire des information HTML: étiquettes, scripts, codes … disponibles dans un fichier d'aide téléchargeable.

http://hot.virtual-pc.com/htmlib/

  • HotSource HTML Character Codes - Listing des codes caractère online.

http://www.sbrady.com/hotsource/html/char.html

Articles, vidéos et guides en lien avec cette rubrique

techniques_multilingues_pour_travailler_avec_des_bases_de_donnees.1354092208.txt · Dernière modification: 2012/11/28 09:43 par lws
 
Sauf mention contraire, le contenu de ce wiki est placé sous la licence suivante : CC Attribution-Noncommercial-Share Alike 3.0 Unported
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki