我使用哈希表以希腊字符存储一些名称和ID。
$hsNames = @{}
$hsNameID = 1
$name = "Νικος"
$hsNames.Add($name, $hsNameID)
$hsNameID++
$name = "Νίκος"
$hsNames.Add($name, $hsNameID)
$hsNames
以上的输出是:
Name Value ---- ----- Νικος 1 Νίκος 2
这意味着当其中一个键中存在希腊重音时,会为同一名称创建两个键。现在我不希望发生这种情况,我需要只有一个带有第一个ID(1)的密钥 - 在MySQL中的utf8_unicode_ci的行为。我想我需要以某种方式告诉powershell在字符串比较中使用Unicode排序算法(http://www.unicode.org/reports/tr10/tr10-33.html)。但是如何?
答案 0 :(得分:1)
有趣的问题,即使有人认为这两个名称因重音而不同。您必须决定是否存储原始拼写和“标准化”拼写,或者只是标准化拼写,因为转换是单向过程。
我找到了两个链接,提供了一种解决方案。 Ignoring accented letters in string comparison和PowerShell version of this same C# code。
使用ISE中的PowerShell脚本,我能够编写以下内容:
$hsNames = @{}
$hsNameID = 1
$name1 = "Νικος"
$hsNames.Add($name1, $hsNameID)
$hsNameID++
$name2 = "Νίκος"
$hsNames.Add($name2, $hsNameID)
$hsNames
$new1 = Remove-StringDiacritic $name1
$new2 = Remove-StringDiacritic $name2
"With Diacritic removed"
$new1
$new2
$new1 -eq $new2
,输出结果为:
Name Value
---- -----
Νικος 1
Νίκος 2
With Diacritic removed
Νικος
Νικος
True
基于此,你可以在插入哈希表之前“规范化”你的字符串,你最终会得到一个而不是你想要的两个。