2011-10-20 38 views
7

Tôi có một tập lệnh tạo người dùng trong Microsoft Exchange Server và Active Directory. Vì vậy, mặc dù đó là commmon rằng tên của người dùng có dấu trọng âm hoặc ñ ở Tây Ban Nha, tôi muốn tránh chúng cho tên người dùng để không gây ra bất kỳ sự không tương thích nào trong các hệ thống cũ.Cách xóa dấu trọng âm trong PowerShell?

Vì vậy, làm cách nào tôi có thể xóa chuỗi như thế này?

$name = "Ramón" 

Để được như vậy? :

$name = "Ramon" 

Trả lời

6

Vâng, tôi có thể giúp bạn với một số mã .....

Tôi sử dụng này thời gian gần đây trong aC# dự án dải từ địa chỉ email:

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

Tôi đoán Bây giờ tôi có thể nói 'mở rộng sang một script/mẫu PowerShell được để lại cho người đọc' .... hy vọng nó sẽ giúp ...

+0

+1 đoạn thông minh, tôi chuyển đổi nó để PowerShell, nó hoạt động như mong đợi nhờ. – JPBlanc

+0

Nó hoạt động khá tốt trong PowerShell. Thực sự cảm ơn vì đã chia sẻ: D –

17

Theo câu trả lời của ip, đây là phiên bản 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 $_ } 

Output:

Rhone 
Basil 
Abo 

Grasantorma 
5

Một dịch PowerShell của @ip cho phi C# lập trình; 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

Một giải pháp khác ... một cách nhanh chóng "tái sử dụng" của bạn C# trong PowerShell (Tín dụng mã C# bị mất ở đâu đó trên mạng).

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

Không cho một số ký tự, ví dụ: 'Æ × Þ ° ± ß…'. [Ví dụ _Old English_ thực] (https://www.researchgate.net/publication/277748378_Fore_daere_maerde_mod_astige_two_new_perspectives_on_the_Old_English_Gifts_of_men): trả về 'Fore ?? re m? R? E?' Nếu được áp dụng cho 'Fore ðære mærðe…' – JosefZ

Các vấn đề liên quan