我有一個在Microsoft Exchange Server和Active Directory中創建用戶的腳本。因此,雖然用戶的姓名有西班牙語的口音,但我希望避免使用用戶名,以免在舊系統中造成任何不兼容。如何刪除PowerShell中的重音符號?
那麼,我該如何清理這樣的字符串呢?
$name = "Ramón"
要這樣嗎? :
$name = "Ramon"
我有一個在Microsoft Exchange Server和Active Directory中創建用戶的腳本。因此,雖然用戶的姓名有西班牙語的口音,但我希望避免使用用戶名,以免在舊系統中造成任何不兼容。如何刪除PowerShell中的重音符號?
那麼,我該如何清理這樣的字符串呢?
$name = "Ramón"
要這樣嗎? :
$name = "Ramon"
嗯,我可以幫你的一些代碼.....
我用這個最近在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腳本/表單留給讀者'......希望它可以幫助....
根據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
@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
另一種解決方案......迅速 「重用」 你的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-ČŠŽ-čšž")
PS> [Text.Encoding]::ASCII.GetString([Text.Encoding]::GetEncoding(1251).GetBytes("Ramón"))
Ramon
PS>
某些人物失敗,例如'Æ×Þ°±ß...'。 [一個真正的_老英語_例子](https://www.researchgate.net/publication/277748378_Fore_daere_maerde_mod_astige_two_new_perspectives_on_the_Old_English_Gifts_of_men):返回'Fore?re m?r?e?',如果適用於'Foreðæremærðe...' – JosefZ
+1智能片斷,我把它轉化爲PowerShell中,它按預期工作的感謝。 – JPBlanc
它在PowerShell中工作得很好。非常感謝分享:D –