【问题标题】:How remove accents in PowerShell?如何删除 PowerShell 中的重音符号?
【发布时间】:2011-12-11 19:23:45
【问题描述】:

我有一个在 Microsoft Exchange Server 和 Active Directory 中创建用户的脚本。因此,尽管在西班牙用户名带有重音符号或 ñ 是很常见的,但我希望避免使用它们,以免用户名在旧系统中造成任何不兼容。

那么,我该如何清理这样的字符串呢?

$name = "Ramón"

要这样吗? :

$name = "Ramon"

【问题讨论】:

    标签: powershell active-directory exchange-server


    【解决方案1】:

    根据 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
    

    【讨论】:

      【解决方案2】:

      我可以帮你写一些代码.....

      我最近在一个 c# 项目中使用它来删除电子邮件地址:

          static string RemoveDiacritics(string input)
          {
              string inputFormD = (input ?? string.Empty).Normalize(NormalizationForm.FormD);
              StringBuilder sb = new StringBuilder();
      
              for (var i = 0; i < inputFormD.Length; i++)
              {
                  UnicodeCategory uc = CharUnicodeInfo.GetUnicodeCategory(inputFormD[i]);
                  if (uc != UnicodeCategory.NonSpacingMark)
                  {
                      sb.Append(inputFormD[i]);
                  }
              }
      
              return (sb.ToString().Normalize(NormalizationForm.FormC));
          }
      

      我想我现在可以说“扩展为 PowerShell 脚本/表单留给读者”....希望对您有所帮助....

      【讨论】:

      • +1 Smart sn-p,我将它转换为 PowerShell,它可以正常工作,谢谢。
      • 它在 PowerShell 中运行良好。非常感谢分享:D
      【解决方案3】:

      @ip 的另一个 PowerShell 翻译,适用于非 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
      

      【讨论】:

        【解决方案4】:

        借助上述示例,我在管道中使用了这个“单线:”(仅在 Win10 中测试):

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

        结果:

        ouooueeui
        

        【讨论】:

          【解决方案5】:
          PS> [Text.Encoding]::ASCII.GetString([Text.Encoding]::GetEncoding(1251).GetBytes("Ramón"))
          Ramon
          PS>
          

          【讨论】:

          • 某些字符失败,例如Æ×Þ°±ß…A real Old English example:如果应用于Fore ðære mærðe…,则返回Fore ??re m?r?e?
          【解决方案6】:

          另一种解决方案...在 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-ČŠŽ-čšž")
          

          【讨论】:

            【解决方案7】:

            您可以在 NFD 字符串上使用 -replace 来删除组合标记,而不是创建字符串构建器和循环字符:

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

            【讨论】:

              猜你喜欢
              • 2011-06-16
              • 1970-01-01
              • 2010-09-19
              • 2012-12-10
              • 2015-08-30
              • 1970-01-01
              • 2016-10-21
              相关资源
              最近更新 更多