powershell 如何将土耳其字符转换为ascii?

piztneat  于 2023-05-17  发布在  Shell
关注(0)|答案(2)|浏览(226)

如何将土耳其字符转换为ASCII?(如şs
我试着更换,但它没有做任何事情。下面是我的代码:

$posta = $posta.ToLower()
$posta = $posta -replace "ü","u" 
$posta = $posta -replace "ı","i"
$posta = $posta -replace "ö","o"
$posta = $posta -replace "ç","c"
$posta = $posta -replace "ş","s"
$posta = $posta -replace "ğ","g"
$posta = $posta.trim()
write-host $posta

如果$postaeylül,则返回eylül

sxissh06

sxissh061#

这个答案的所有学分与同一答案中的评论相结合,该答案显示了通过过滤不是NonSpacingMark的字符,然后用i替换ı的适当方法。答案是在c#中,因此分享如何在powershell中完成。
原始答案使用Enumerable.Where,在PowerShell中看起来像这样:

$posta = 'üıöçşğ'
[string]::new([System.Linq.Enumerable]::Where(
    [char[]] $posta.Normalize([Text.NormalizationForm]::FormD),
    [Func[char, bool]]{ [char]::GetUnicodeCategory($args[0]) -ne [Globalization.UnicodeCategory]::NonSpacingMark })).
    Replace('ı', 'i')

然而,Linq语法在PowerShell中非常麻烦,因为这些不是extension methods,我们需要直接调用API。一个相对简单的方法是使用.Where intrinsic方法:

$posta = 'üıöçşğ'
[string]::new($posta.Normalize([Text.NormalizationForm]::FormD).ToCharArray().
    Where{ [char]::GetUnicodeCategory($_) -ne [Globalization.UnicodeCategory]::NonSpacingMark }).
    Replace('ı', 'i')

使用-replace运算符的简化regex方法,感谢mklement0的提示:

$posta = 'üıöçşğ'
$posta.Normalize('FormD') -replace '\p{M}' -creplace 'ı', 'i'

请参阅Unicode类别或Unicode块:\p{}详细信息。

lmyy7pcs

lmyy7pcs2#

使用 PowerShell(Core)7+ 替代方案补充Santiago Squarzon's helpful answer,该替代方案基于this helpful answer中的指导,解释了土耳其字母表中有一组固定的12个字符,它们具有等效的ASCII字符:

  • 注意:圣地亚哥的答案使用了一种方法,即 * 通常 * 从字母中删除重音符号(变音符号),然后添加土耳其语特定的ı处理。下面的解决方案 * 特定于土耳其字母 *(区分大小写;它可以容易地被修改为大小写不敏感/全小写)。
# PS 7+

$turkish = 'ıİöÖçÇüÜğĞşŞ' # Turkish chars. with ASCII equivalents...
$ascii   = 'iIoOcCuUgGsS' # ...and their ASCII equivalents.

# Replace those Turkish chars. that have ASCII equivalents with their equivalents.
# ->  'A_iIoOcCuUgGsS_Z'
'A_ıİöÖçÇüÜğĞşŞ_Z' -replace ('[' + $turkish + ']'),
                            { $ascii[$turkish.IndexOf($_.Value)] }

该解决方案依赖于基于regex-replace运算符的PowerShell(Core)7+功能,即传递script block{ ... })作为替换操作数的选项,这使得能够基于每个报告的匹配($_.Value)通过算法确定替换值。

相关问题