PI Services

Le blog des collaborateurs de PI Services

PowerShell - Convertir les signes diacritiques

Un signe diacritique ou diacritique est un élément ajouté à une lettre, par exemple dans la langue française, les biens connus : à, é, ç mais également les ł, ø, ß utilisés dans d'autres langues. La plupart des logiciels ne sont pas capables de traiter les diacritiques correctement ce qui peut avoir pour conséquence une simple gêne utilisateur ou dans le pire des cas des accès non fonctionnels.

Comment alors se débarrasser de ces diacritiques ? Hors de question de les retirer complétement, car ils font partie intégrante des mots, il faut alors essayer de les convertir vers des caractères connus par les logiciels. 

 

La fonction de conversion des diacritiques

function Convert-Diacritic #Fonction qu'il faudra appeler pour convertir le diacritique
{
    [CmdletBinding()] #Déclaration des paramètres qu'il faudra fournir à la fonction pour qu'elle puisse s'exécuter
    Param
    (
        [Parameter(Mandatory=$true)] #Indique que ce paramètre est facultatif
        [ValidateNotNullOrEmpty()] #Indique que ce champ ne peut pas être vide ou null, s'il est obligatoire
        [string]$InputString #Paramètre qui attend la chaîne de caractères qui contient les diacritiques à convertir
    )

    Begin 
    {
        $Return = @{} #Tableau de retour qui contient la chaîne de caractères sans diacritiques
        
        $DiacriticsArray = @{ #Hashtable, aussi appelé tableau de conversion dans ce script, qui contient à droite du signe égal le caractère avec diacritique et à gauche du signe égale, le caractère cible post conversion
            #Par exemple à deviendra a après conversion
            #Pour déterminer vers quel caractère convertir un diacritique, une simple recherche internet peut être utilisé
            a = 'à', 'á', 'â', 'ã', 'ā', 'ă', 'ą'
            aa = 'å'
            ae = 'ä', 'æ'
            c = 'ç', 'ć', 'ĉ', 'ċ', 'č'
            d = 'ď', 'đ'
            e = 'è', 'é', 'ê', 'ë', 'ē', 'ĕ', 'ė', 'ę', 'ě'
            g = 'ĝ', 'ğ', 'ġ', 'ģ'
            h = 'ĥ', 'ħ'
            i = 'ì', 'í', 'î', 'ï', 'ĩ', 'ī', 'ĭ', 'ı', 'į'
            ij = 'ij'
            j = 'ĵ'
            k = 'ķ', 'ĸ'
            l = 'ĺ', 'ļ', 'ľ', 'ŀ', 'ł'
            n = 'ñ', 'ń', 'ņ', 'ň', 'ŋ'
            o = 'ò', 'ó', 'ô', 'õ', 'ō', 'ŏ', 'ő'
            oe = 'ö', 'ø', 'œ'
            r = 'ŕ', 'ŗ', 'ř'
            s = 'ś', 'ŝ', 'ş', 'š'
            ss = 'ß'
            t = 'ţ', 'ť', 'ŧ'
            th = 'þ'
            u = 'ù', 'ú', 'û', 'ũ', 'ů', 'ū', 'ŭ', 'ű', 'ų'
            ue = 'ü'
            w = 'ŵ'
            y = 'ý', 'ÿ', 'ŷ'
            z = 'ź', 'ż', 'ž'
        }
    }

    Process
    {
        $OutputString = $InputString.ToLower() #Transforme tous les caractères majuscules de la chaîne de caractères d'entrée en minuscule
        #Le tableau ne peut convertir que les diacritiques minuscules, cela simplifie également la maintenabilité du tableau de conversion et du code

        foreach ($Letter in $DiacriticsArray.GetEnumerator()) #On parcourt chaque paire lettres/diacritiques du tableau de conversion
        #La méthode GetEnumerator permet de générer deux propriétés Key et Value pour chaque paire du tableau de conversion, ci-après appelé $Letter.Value et $Letter.Key
        {
            $DiacriticsLetter = $Letter.Value #Letter.Value contient l'ensemble des diacritiques d'une paire (ligne) du tableau de conversion
            foreach ($Diacritic in $DiacriticsLetter) #On parcourt chaque diacritique d'une ligne
            {
                if ($OutputString -match $Diacritic) #Si le diacritique qui est en train d'être parcouru est contenu dans la chaîne de caractères d'entrée, le code suivant sera exécuté
                {
                    $OutputString = $OutputString.Replace($Diacritic, $Letter.Key) #Le diacritic qui en train d'être parcouru est remplacé par le caractère cible de conversion contenu dans la propriété $Letter.Key 
                }
            }
        }

        #La boucle précédente va donc répéter les actions décrites précédemment pour chaque paire et chaque diacritique du tableau de conversion

        $Return.outputStringObject = $OutputString #Attribution de la chaîne de caractères sans diacritiques à la variable de sortie
        Return $Return #Retourne la chaîne de caractères sans diacritiques
    }
}

 

Exemple d'utilisation de la fonction de conversion

Le script suivant appelle la fonction de conversion de diacritique lorsque lui-même est appelé

. .\Convert-Diacritic_article.ps1 #Permet de déclarer (dot source) la fonction de conversion de diacritique pour qu'elle puisse être utilisée

$String = Convert-Diacritic -InputString "DébutăîœăßøFin" #Appelle de la fonction de conversion de diacritique et lui passe en paramètre une chaîne de caractères qui contient des diacritiques 

$String.outputStringObject #La chaîne de caractères sans diacritiques est contenu dans la propriété outputStringObject, elle est donc appelée pour afficher le résultat

 

Appel du script précédent

PS D:\A_folder> .\Just_call_me_already.ps1 #Appel du script précédent qui contient l'appelle de la fonction de conversion de diacritique
debutaioeassoefin #Les diacritiques dans la chaîne de caractères ont été convertis selon les règles du tableau de conversion 

 

Remarque : les scripts qui manipulent des diacritiques, tels que les scripts ci-avant, doivent être encodés avec du BOM, par exemple UTF-8 with BOM, sans quoi les diacritiques seront mal convertis par l'IDE (integrated development environment) et empêcheront la bonne exécution du code.

Ajouter un commentaire

Loading