Как убрать акценты в PowerShell? - PullRequest
7 голосов
/ 20 октября 2011

У меня есть скрипт, который создает пользователей в Microsoft Exchange Server и Active Directory.Итак, хотя общепринято, что имена пользователей имеют акценты или - в Испании, я хочу, чтобы они не использовались для имени пользователя, чтобы не вызывать несовместимости в старых системах.

Итак, как я могу очистить строку, подобную этой?

$name = "Ramón"

Быть таким?:

$name = "Ramon"

Ответы [ 7 ]

20 голосов
/ 20 октября 2011

Согласно ответу 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
7 голосов
/ 20 октября 2011

Ну, я могу помочь вам с некоторыми кодами .....

Я недавно использовал это в проекте 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 оставлено читателю" .... надеюсь, это поможет ....

6 голосов
/ 21 октября 2011

Еще один перевод PowerShell @ip для не кодеров C #; 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
3 голосов
/ 13 августа 2015
PS> [Text.Encoding]::ASCII.GetString([Text.Encoding]::GetEncoding(1251).GetBytes("Ramón"))
Ramon
PS>
2 голосов
/ 21 июня 2013

Другое решение ... быстро "повторно" использовать ваш 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-ČŠŽ-čšž")
1 голос
/ 20 апреля 2018

С помощью приведенных выше примеров я использую это "one-liner:" в трубе (проверено только в Win10):

"öüóőúéáűí".Normalize("FormD") -replace '\p{M}', ''

Результат:

ouooueeui
0 голосов
/ 23 марта 2018

Вместо создания строителя строк и циклического перемещения по символам вы можете просто использовать -replace в строке NFD для удаления меток объединения:

function Remove-Diacritics {
param ([String]$src = [String]::Empty)
  $normalized = $src.Normalize( [Text.NormalizationForm]::FormD )
  ($normalized -replace '\p{M}', '')
}
...