J'ai un script qui crée des utilisateurs dans Microsoft Exchange Server et Active Directory. Donc, bien que ce soit common que les noms d'utilisateur ont des accents ou ± en Espagne, je souhaite les éviter pour le nom d'utilisateur de ne pas causer d'incompatibilités dans les anciens systèmes.
Alors, comment puis-je nettoyer une chaîne comme celle-ci? p> comme ça? : p>
7 Réponses :
Eh bien, je peux vous aider avec une partie du code .....
J'ai utilisé ceci récemment dans le projet AC # pour dépouiller des adresses électroniques: p>
static string RemoveDiacritics(string input) { string inputFormD = (input ?? string.Empty).Normalize(NormalizationForm.FormD); StringBuilder sb = new StringBuilder(); for (var i = 0; i < inputFormD.Length; i++) { UnicodeCategory uc = CharUnicodeInfo.GetUnicodeCategory(inputFormD[i]); if (uc != UnicodeCategory.NonSpacingMark) { sb.Append(inputFormD[i]); } } return (sb.ToString().Normalize(NormalizationForm.FormC)); }
+1 Smart Snippet, je l'ai converti sur PowerShell, cela fonctionne comme prévu merci.
Cela fonctionne assez bien dans PowerShell. Vraiment merci pour le partage: D
Selon la réponse de la propriété intellectuelle, voici la version PowerShell.
Rhone Basil Abo Grasantorma
Une autre traduction PowerShell de @ip pour les codeurs non C #; O)
function Remove-Diacritics { param ([String]$sToModify = [String]::Empty) foreach ($s in $sToModify) # Param may be a string or a list of strings { if ($sToModify -eq $null) {return [string]::Empty} $sNormalized = $sToModify.Normalize("FormD") foreach ($c in [Char[]]$sNormalized) { $uCategory = [System.Globalization.CharUnicodeInfo]::GetUnicodeCategory($c) if ($uCategory -ne "NonSpacingMark") {$res += $c} } return $res } } Clear-Host $name = "Un été de Raphaël" Write-Host (Remove-Diacritics $name ) $test = ("äâûê", "éèà ", "ùçä") $test | % {Remove-Diacritics $_} Remove-Diacritics $test
Une autre solution ... rapidement "réutiliser" votre c # dans PowerShell (C # Code Crédits perdue quelque part sur le net).
Add-Type -TypeDefinition @" using System.Text; using System.Globalization; public class Utils { public static string RemoveDiacritics(string stIn) { string stFormD = stIn.Normalize(NormalizationForm.FormD); StringBuilder sb = new StringBuilder(); for (int ich = 0; ich < stFormD.Length; ich++) { UnicodeCategory uc = CharUnicodeInfo.GetUnicodeCategory(stFormD[ich]); if (uc != UnicodeCategory.NonSpacingMark) { sb.Append(stFormD[ich]); } } return (sb.ToString().Normalize(NormalizationForm.FormC)); } } "@ | Out-Null [Utils]::RemoveDiacritics("ABC-abc-ÄŠŽ-Äšž")
PS> [Text.Encoding]::ASCII.GetString([Text.Encoding]::GetEncoding(1251).GetBytes("Ramón")) Ramon PS>
Échoue pour certains personnages, par exemple æ × þ ° ± ß ... code>. Un vrai ancien anglais i> Exemple : retour
avant ?? Re M? R? E? E? Code> Si appliqué à
avant ðære mærðe ... code>
Au lieu de créer un StringBuilder et une boucle sur des caractères, vous pouvez simplement utiliser -replace sur la chaîne NFD pour supprimer les marques de combinaison:
function Remove-Diacritics { param ([String]$src = [String]::Empty) $normalized = $src.Normalize( [Text.NormalizationForm]::FormD ) ($normalized -replace '\p{M}', '') }
Avec l'aide des exemples ci-dessus, j'utilise cette "one-liner:" dans tuyau (testé uniquement dans Win10): résultat: p>