String 将Unicode字符串转换为ASCII

String 将Unicode字符串转换为ASCII,string,powershell,unicode,ascii,special-characters,String,Powershell,Unicode,Ascii,Special Characters,我的字符串包含ASCII中找不到的字符;例如,阿,埃,í,ó,ú;我需要一个函数把它们转换成可以接受的东西,比如a,e,I,o,u。这是因为我将从这些字符串创建IIS网站(即,我将使用它们作为域名)。在PowerShell中,它似乎可以工作,大致如下所示: function Remove-Diacritics { Param([string]$Text) $chars = $Text.Normalize([System.Text.NormalizationForm]::For

我的字符串包含ASCII中找不到的字符;例如,阿,埃,í,ó,ú;我需要一个函数把它们转换成可以接受的东西,比如a,e,I,o,u。这是因为我将从这些字符串创建IIS网站(即,我将使用它们作为域名)。

在PowerShell中,它似乎可以工作,大致如下所示:

function Remove-Diacritics
{
    Param([string]$Text)


    $chars = $Text.Normalize([System.Text.NormalizationForm]::FormD).GetEnumerator().Where{ 

        [System.Char]::GetUnicodeCategory($_) -ne [System.Globalization.UnicodeCategory]::NonSpacingMark

    }


    (-join $chars).Normalize([System.Text.NormalizationForm]::FormC)

}
e、 g

结果函数将按以下方式转换变音符号:

PS C:\> Convert-DiacriticCharacters "Ångström"
Angstrom
PS C:\> Convert-DiacriticCharacters "Ó señor"
O senor

抄袭自:

一般称为音译。规范化为FormD和过滤可以将合成的拉丁字母转换为字母,但不能转换为连字(dž、ǣ、ij等)。看这个。
function Convert-DiacriticCharacters {
    param(
        [string]$inputString
    )
    [string]$formD = $inputString.Normalize(
            [System.text.NormalizationForm]::FormD
    )
    $stringBuilder = new-object System.Text.StringBuilder
    for ($i = 0; $i -lt $formD.Length; $i++){
        $unicodeCategory = [System.Globalization.CharUnicodeInfo]::GetUnicodeCategory($formD[$i])
        $nonSPacingMark = [System.Globalization.UnicodeCategory]::NonSpacingMark
        if($unicodeCategory -ne $nonSPacingMark){
            $stringBuilder.Append($formD[$i]) | out-null
        }
    }
    $stringBuilder.ToString().Normalize([System.text.NormalizationForm]::FormC)
}
PS C:\> Convert-DiacriticCharacters "Ångström"
Angstrom
PS C:\> Convert-DiacriticCharacters "Ó señor"
O senor