如何删除PowerShell中的重音?

Ant*_*una 7 powershell exchange-server active-directory

我有一个脚本,可以在Microsoft Exchange Server和Active Directory中创建用户.因此,虽然通常用户的名字在西班牙有重音符号或ñ,但我想避免使用用户名,以免在旧系统中造成任何不兼容性.

那么,我怎么能像这样清理一个字符串呢?

$name = "Ramón"
Run Code Online (Sandbox Code Playgroud)

那样的?:

$name = "Ramon"
Run Code Online (Sandbox Code Playgroud)

von*_*ryz 20

根据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 $_ }
Run Code Online (Sandbox Code Playgroud)

输出:

Rhone
Basil
Abo

Grasantorma
Run Code Online (Sandbox Code Playgroud)


pen*_*eri 7

好吧,我可以帮你解决一些代码......

我最近在ac#project中使用了这个来删除电子邮件地址:

    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));
    }
Run Code Online (Sandbox Code Playgroud)

我想我现在可以说'延伸到PowerShell脚本/表单留给了读者'....希望它有帮助......


JPB*_*anc 7

@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
Run Code Online (Sandbox Code Playgroud)


小智 7

在上面示例的帮助下,我在管道中使用了这个“one-liner:”(仅在 Win10 中测试):

\n\n
"\xc3\xb6\xc3\xbc\xc3\xb3\xc5\x91\xc3\xba\xc3\xa9\xc3\xa1\xc5\xb1\xc3\xad".Normalize("FormD") -replace \'\\p{M}\', \'\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

结果:

\n\n
ouooueeui\n
Run Code Online (Sandbox Code Playgroud)\n