2015-01-06 29 views
3

排序捷克我有以下perl程序在Perl

use 5.014_001; 
use utf8; 
use Unicode::Collate::Locale; 


require 'Unicode/Collate/Locale/cs.pl'; 

binmode STDOUT, ':encoding(UTF-8)'; 

my @old_list = (
     "cash", 
     "Cash", 
     "cat", 
     "Cat", 
     "čash", 
     "dash", 
     "Dash", 
     "Ďash", 
     "database", 
     "Database", 
     ); 


my $col= Unicode::Collate::Locale->new(
    level => 3,      
    locale => 'cs', 
    normalization => 'NFD', 
); 


my @list = $col->sort(@old_list); 

foreach my $item (@list){ 

    print $item, "\n"; 

} 

該程序將打印輸出:

現金 現金 貓 貓 現金 破折號 短跑 DASH 數據庫 數據庫

我相信ac areful觀察者會得出結論,在捷克或者

  1. č是一流的字母,而d不是。
  2. 的統一::分頁::在Perl捷克的區域設置的排序是不正確的

我願意相信(1),和下面的支持了我的情況:

http://en.wiktionary.org/wiki/Index_talk:Czech

它說:

讓我們儘可能按現有的捷克公約排序條目。也就是說,只有下列字符有任何排序的意義:

ABCčdefgh CH ijklmnopqrřšštuvwxyzž

但我很困惑,因爲我認爲「與AV d超過它」(和它的小寫相當於),是捷克字母的頭等字母。

@tchrist在什麼時候需要他?

我很感謝這方面的任何見解。

+0

我對捷克幾乎一無所知,但是如果CLDR沒有在捷克語中指定,* * *是* d *之後的自己的字母排序* * * *是* c *之後它自己的字母排序的方式,則這將解釋你所看到的。如果你需要使用'--locale =>「cs」'默認的'--locale =>「cs」',通過使用精心設計的'--entry'參數給構造函數重寫DUCET,可以在collat​​or中引入剪裁精確指定的元素。我沒有得到你的ping,因爲你沒有評論我的帖子或添加評論給我的評論鏈。 – tchrist

回答

0

如果默認的排序是不適合你的工作,這種常見的解決方法是一個簡單的做它自己:

通過變換你的字符串做一個排序數組:如果aá應該是等價的,轉換都到a;如果á應該遵循a,則將其轉換爲a[,例如(z之後的任何字符都應該沒問題)。如果我理解正確,則將ch轉換爲h[,如h所示。然後將原始數組與排序數組一起排序。

+0

我希望無論(1)某人驗證我的結果是正確的(2)有一些「修理」這種使用剪裁的東西,我真的不明白。 – egilchri