将Unicode字符串转换为ASCII
问题描述:
我有一些字符串包含在ASCII中找不到的字符;如á,é,í,ó,ú;我需要一个函数将它们转换成可接受的东西,比如a,e,i,o,u。这是因为我将从这些字符串创建IIS网站(即,我将使用它们作为域名)。将Unicode字符串转换为ASCII
答
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)
}
产生的功能将转换变音符号在follwoing方式:
PS C:\> Convert-DiacriticCharacters "Ångström"
Angstrom
PS C:\> Convert-DiacriticCharacters "Ó señor"
O senor
从复制:http://cosmoskey.blogspot.nl/2009/09/powershell-function-convert.html
答
以this answer from a C#/.Net question似乎在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)
}
例如
PS C:\> Remove-Diacritics 'abcdeéfg'
abcdeefg
一般情况下,这就是所谓的音译。正常化到FormD和过滤将工作将组合拉丁字母转换为[基本拉丁文](http://www.unicode.org/charts/nameslist/index.html)字母但不是连字(dž,ǣ,ij,...)和这样。看到这个[问题](https://stackoverflow.com/questions/1841874/how-to-transliterate-cyrillic-to-latin-text)。 –