2011-10-20 9 views
7

Ho uno script che crea utenti in Microsoft Exchange Server e Active Directory. Quindi, sebbene sia comune il fatto che i nomi degli utenti abbiano accenti o ñ in Spagna, voglio evitarli per il nome utente per non causare incompatibilità nei vecchi sistemi.Come rimuovere gli accenti in PowerShell?

Quindi, come posso pulire una stringa come questa?

$name = "Ramón" 

Per essere così? :

$name = "Ramon" 

risposta

6

Beh ti posso aiutare con un po 'di codice .....

ho usato questo di recente in aC# progetto di mettere a nudo da indirizzi e-mail:

static string RemoveDiacritics(string stIn) 
    { 
     string stFormD = (stIn ?? string.Empty).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)); 
    } 

immagino Ora posso dire che 'estendere in uno script/modulo PowerShell è lasciato al lettore' .... spero che aiuti ....

+0

+1 intelligente frammento, ho convertito a PowerShell, funziona come previsto, grazie. – JPBlanc

+0

Funziona abbastanza bene in PowerShell. Davvero grazie per aver condiviso: D –

17

Come per la risposta di ip, ecco la versione di PowerShell.

function Remove-Diacritics { 
param ([String]$src = [String]::Empty) 
    $normalized = $src.Normalize([Text.NormalizationForm]::FormD) 
    $sb = new-object Text.StringBuilder 
    $normalized.ToCharArray() | % { 
    if([Globalization.CharUnicodeInfo]::GetUnicodeCategory($_) -ne [Globalization.UnicodeCategory]::NonSpacingMark) { 
     [void]$sb.Append($_) 
    } 
    } 
    $sb.ToString() 
} 

# Test data 
@("Rhône", "Basíl", "Åbo", "", "Gräsäntörmä") | % { Remove-Diacritics $_ } 

uscita:

Rhone 
Basil 
Abo 

Grasantorma 
5

Un'altra traduzione PowerShell di @ip per C# programmatori non; 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 
2

Un'altra soluzione ... in fretta "riuso" C# in PowerShell (Crediti di codice C# persi da qualche parte sulla rete).

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-ČŠŽ-čšž") 
3
PS> [Text.Encoding]::ASCII.GetString([Text.Encoding]::GetEncoding(1251).GetBytes("Ramón")) 
Ramon 
PS> 
+0

Errore per alcuni caratteri, ad es. 'Æ × Þ ° ± ß ...'. [Un vero _Old English_esempio] (https://www.researchgate.net/publication/277748378_Fore_daere_maerde_mod_astige_two_new_perspectives_on_the_Old_English_Gifts_of_men): restituisce 'Fore ?? re m? R? E?' Se applicato a 'Fore ðære mærðe ...' – JosefZ

Problemi correlati