我有一个脚本可以在Microsoft Exchange Server和Active Directory中创建用户。因此,虽然通常用户的名字在西班牙有重音符号或ñ,但我想避免使用用户名,以免在旧系统中造成任何不兼容性。
那么,我怎么能像这样清理一个字符串?
$name = "Ramón"
那样吗? :
$name = "Ramon"
答案 0 :(得分:19)
根据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
答案 1 :(得分:7)
我可以帮你解决一些代码......
我最近在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脚本/表单留给了读者'....希望它有所帮助......
答案 2 :(得分:6)
非C#编码器的@ip的另一个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
答案 3 :(得分:3)
PS> [Text.Encoding]::ASCII.GetString([Text.Encoding]::GetEncoding(1251).GetBytes("Ramón"))
Ramon
PS>
答案 4 :(得分:2)
另一种解决方案......在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-ČŠŽ-čšž")
答案 5 :(得分:1)
在上面的例子的帮助下,我在管道中使用这个“one-liner:”(仅在Win10中测试):
"öüóőúéáűí".Normalize("FormD") -replace '\p{M}', ''
结果:
ouooueeui
答案 6 :(得分:0)
您可以在NFD字符串上使用-replace来删除组合标记,而不是创建字符串构建器并循环遍历字符:
function Remove-Diacritics {
param ([String]$src = [String]::Empty)
$normalized = $src.Normalize( [Text.NormalizationForm]::FormD )
($normalized -replace '\p{M}', '')
}