2011-10-20 17 views
7

Microsoft Exchange Server ve Active Directory'de kullanıcı oluşturan bir komut dosyası var. Bu yüzden, kullanıcı isimlerinin İspanya'da aksan veya ñ olduğunu varsayarak, eski sistemlerde uyumsuzluklara neden olmamak için kullanıcı adından kaçınmak istiyorum.PowerShell'deki aksanları nasıl kaldırırsınız?

Böyle bir ipi nasıl temizleyebilirim?

$name = "Ramón" 

Bunun gibi mi? :

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)); 
    } 

sanırım:

$name = "Ramon" 

cevap

6

Eh ben e-posta adreslerinden şerit bu son zamanlarda aC# projesini kullanılan

..... kod bazı size yardımcı olabilir Artık 'bir PowerShell betiğine/formuna genişletmek okuyucuya bırakıldı' diyebilirim .... umarım yardımcı olur ....

+0

+1 Akıllı pasajı, ben beklenen teşekkür olarak çalışır, PowerShell'e onu dönüştürülür. – JPBlanc

+0

PowerShell'de oldukça iyi çalışıyor. Paylaşım için çok teşekkürler: D –

17

IP'nin cevabı gibi, burada Powershell sürümüdür.

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 $_ } 

Çıktı:

Rhone 
Basil 
Abo 

Grasantorma 
5

olmayan C# kodlayıcıları için @ip başka PowerShell çeviri; 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

Başka bir çözüm ... çabucak "yeniden kullanım" PowerShell C# (C# kodu kredileri net bir yerde kayboldu).

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

Bazı karakterler için hatalar, ör. '± x Ş ° ± ß ...'. [Gerçek bir _Old English_ örneği] (https://www.researchgate.net/publication/277748378_Fore_daere_maerde_mod_astige_two_new_perspectives_on_the_Old_English_Gifts_of_men): 'Fore éære mærðe' ye uygulandığında 'Fore' re m? R? E? – JosefZ

İlgili konular