2011-10-20 35 views
7

我有一個在Microsoft Exchange Server和Active Directory中創建用戶的腳本。因此,雖然用戶的姓名有西班牙語的口音,但我希望避免使用用戶名,以免在舊系統中造成任何不兼容。如何刪除PowerShell中的重音符號?

那麼,我該如何清理這樣的字符串呢?

$name = "Ramón" 

要這樣嗎? :

$name = "Ramon" 

回答

6

嗯,我可以幫你的一些代碼.....

我用這個最近在C#項目從電子郵件地址剝離:

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

我猜我現在可以說'擴展到PowerShell腳本/表單留給讀者'......希望它可以幫助....

+0

+1智能片斷,我把它轉化爲PowerShell中,它按預期工作的感謝。 – JPBlanc

+0

它在PowerShell中工作得很好。非常感謝分享:D –

17

根據ip。的回答,這裏是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 $_ } 

輸出:

Rhone 
Basil 
Abo 

Grasantorma 
5

@ip的非C#程序員另一個PowerShell的翻譯; 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

另一種解決方案......迅速 「重用」 你的C#在PowerShell中( C#代碼信用在網上某處丟失)。

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

某些人物失敗,例如'Æ×Þ°±ß...'。 [一個真正的_老英語_例子](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?',如果適用於'Foreðæremærðe...' – JosefZ