2011-10-20 14 views
7

Microsoft Exchange ServerとActive Directoryにユーザーを作成するスクリプトがあります。ですから、スペインではユーザーの名前にアクセント記号やアクセント記号が付いているのですが、古いシステムではユーザー名が互換性を失わないようにしたいと考えています。PowerShellでどのようにアクセントを削除しますか?

これで、このような文字列をどのように整理できますか?

$name = "Ramón" 

そうですか? :

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

私が推測:

$name = "Ramon" 

答えて

6

まあ、私は、電子メールアドレスから取り除くために、この最近AC IN#プロジェクトを使用

.....コードのいくつかのお手伝いをすることができます私は今、 'PowerShellのスクリプトに拡張する/フォームが読者に残されていると言うことができます.... ....それが助けてくれることを願っています....

+0

+1スマートスニペットは、私はそれが期待感謝として働いて、PowerShellのにそれを変換します。 – JPBlanc

+0

PowerShellではうまく動作します。共有のため本当にありがとうございます:D –

17

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

以外のC#プログラマーのための@ipの別の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

別の解決策...すぐに "再利用" PowerShellであなたのC#( 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Éremærðe...」に適用された場合、「Fore?re m?r?e?」を返します。 – JosefZ

関連する問題