Powershell哈希表和重复键

时间:2016-01-22 18:32:40

标签: mysql powershell hashtable collation

我使用哈希表以希腊字符存储一些名称和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)。但是如何?

1 个答案:

答案 0 :(得分:1)

有趣的问题,即使有人认为这两个名称因重音而不同。您必须决定是否存储原始拼写和“标准化”拼写,或者只是标准化拼写,因为转换是单向过程。

我找到了两个链接,提供了一种解决方案。 Ignoring accented letters in string comparisonPowerShell 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

基于此,你可以在插入哈希表之前“规范化”你的字符串,你最终会得到一个而不是你想要的两个。