2011-12-28 13 views
5

Vorrei un indice per un elenco. Ad esempio l'elenco dei contatti Android ha #, A-Z. Ma per molte impostazioni locali questo non copre tutti i caratteri specifici della locale.Caratteri indice specifici locali

Come è il supporto per questo in diversi linguaggi di programmazione? Ho preso una rapida occhiata e, in caso di Java nucleo non ho visto nulla di m

in qualche modo correlato: http://cldr.unicode.org/development/development-process/design-proposals/index-characters

+0

FYI: si potrebbe beneficiare di questa Area 51 [I18N e L10N proposta] (http://area51.stackexchange.com/proposals/12416/i18n-l10n). – McDowell

risposta

3

Questa è una MOLTO bella domanda!

Come si nota nel tag , la cosa importante non è il linguaggio di programmazione. È il set di dati di cui hai veramente bisogno qui. Non conosco alcun repository per queste cose. I dati do non contengono ancora questa cosa. Ecco una semplice tabella di sequenze per vari codici twosᴏ a due lettere, oltre a qualche extra per sequenze asiatiche, scritto in Perl. Questo genere di cose potrebbe essere la base di un modulo.

Richiede una gestione un po 'attenta, perché non è possibile catalogare alla cieca il primo grafo in ciascun elemento senza considerare le impostazioni locali se si desidera un set "maiuscolo". Questo a causa del problema I turco. Installerei metodi per estrarre le sequenze e rilevare tali cose se chiedessero qualcosa nelle lingue turche.

use utf8; 
use strict; 
use warnings; 

our %Alphabet = (
    en => [qw(a b c d e f g h i j k l m n o p q r s t u v w x y z)], 

    br => [qw(a b ch c'h d e f g h i j k l m n o p r s t u v w y z)], 
    cy => [qw(a b c ch d dd e f ff g ng h i l ll m n o p ph r rh s t th u w y)], 
    ga => [qw(a á b c d e é f g h i í l m n o ó p r s t u ú)], 
    gd => [qw(a b c d e f g h i l m n o p r s t u)], 

    la => [qw(a b c d e f g h i k l m n o p q r s t v x y z)], 
    it => [qw(a b c d e f g h i k l m n o p q r s t u v z)], 
    es => [qw(a b c d e f g h i j k l m n ñ o p q r s t u v w x y z)], 
    es__traditional => 
      [qw(a b c ch d e f g h i j k l ll m n ñ o p q r s t u v w x y z)], 
    eu => [qw(a b c ch d e f g h i j k l ll m n ñ o p q r s t ts tx tz u v w x y z)], 
    rm => [qw(a b c d e f g h i j l m n o p q r s t u v x z)], 
    ro => [qw(a ă â b c d e f g h i î j k l m n o p q r s ș t ț u v w x y z)], 
    oc => [qw(a b c d e f g h i j l m n o p q r s t u v x z)], 

    sw => [qw(a b c d e f g h i j k l m n o p q r s t u v w x y z å ä ö)], 
    no => [qw(a b c d e f g h i j k l m n o p q r s t u v w x y z æ ø å)], 
    is => [qw(a á b d ð e é f g h i í j k l m n o ó p r s t u ú v x y ý þ æ ö)], 

    cz => [qw(a á b c č d ď e é ě f g h ch i í j k l m n ň o ó p q r ř s š t ť u ú ů v w x y ý z ž)], 
    sk => [qw(a á ä b c č d ď dz dž e é f g h ch i í j k l ĺ ľ m n ň o ó ô p q r ŕ s š t ť u ú v w x y ý z ž)], 
    sl => [qw(a b c č d e f g h i j k l m n o p r s š t u v z ž)], 

    pl => [qw(a ą b c ć d e ę f g h i j k l ł m n ń o ó p r s ś t u w y z ź ż)], 

    lt => [qw(a ą b c č d e ę ė f g h i į y j k l m n o p r s š t u ų ū v z ž)], 
    lv => [qw(a ā b c č d e ē f g ģ h i ī j k ķ l ļ m n ņ o p r s š t u ū v z ž)], 
    et => [qw(a b d e f g h i j k l m n o p r s š z ž t u v õ ä ö ü)], 
    et__full => 
      [qw(A B C D E F G H I J K L M N O P Q R S Š Z Ž T U V W Õ Ä Ö Ü X Y)], 
    et__simple => [qw(a b d e g h i j k l m n o p r s t u v õ ä ö ü)], 

    hu => [qw(a á b c cS d dz dzs e é f g gy H i í j k l ly M n ny O ó ö ő p q r s sz t ty u ú ü ű v w x y z zs)], 
    hu__traditional => 
      [qw(a á b c cs d dz dzs e é f g gy h i í j k l ly m n ny o ó ö ő p r s sz t ty u ú ü ű v z zs)], 

    tr => [qw(a b c ç d e f g ğ h ı i j k l m n o ö p r s ş t u ü v y z)], 
    az => [qw([a b c ç d e ə f g ğ h x ı i j k q l m n o ö p r s ş t u ü v y z)], 
    az_1918_1939 => 
     [qw(a в c ç d e ə f g ƣ h i ь j k q l m n o ɵ p r s ş t u v x y z ƶ)], 
    az_1939_1958 => 
     [qw(а б в г ғ д е ё ә ж з и й к қ л м н о ө п р с т у ү ф х h ц ч ҷ ш щ ъ ы ь э ю я ')], 
    az_1958_1991 => 
     [qw(а б в г ғ д e ә ж з и ы ј к ҝ л м н о ө п р с т у ү ф х һ ч ҹ ш ')], 
    az_1991_1992 => 
     [qw(a ä b c ç d e f g ğ h x ı i j k q l m n o ö p r s ş t u ü v y z)], 

    he => [qw(α β γ δ ε ζ η θ ι κ λ μ ν ξ ο π ρ σ τ υ φ χ ψ ω)], 

    ru => [qw(а б в г д е ж з и к л м н о п р с т у ф х ц ч ш щ ы э ю я)], 
    uk => [qw(а б в г ґ д е є ж з и і ї й к л м н о п р с т у ф х ц ч ш щ ь ю я)], 
    mk => [qw(а б в г д ѓ е ж з ѕ и ј/к л љ м н њ о п р с т ќ/у ф х ц ч џ ш)], 


    "HIRAGANA AIUEO" => 
     [qw(あ い う え お か き く け こ さ し す せ そ た ち つ て と な に ぬ ね の は ひ ふ へ ほ ま み む め も や ゆ よ ら り る れ ろ わ を ん)], 
    "KATAKANA AIUEO" => 
     [qw(ア イ ウ エ オ カ キ ク ケ コ サ シ ス セ ソ タ チ ツ テ ト ナ ニ ヌ ネ ノ ハ ヒ フ ヘ ホ マ ミ ム メ モ ヤ ユ ヨ ラ リ ル レ ロ ワ ヲ ン)], 
    "HALFWIDTH KATAKANA AIUEO" => 
     [qw(ア イ ウ エ オ カ キ ク ケ コ サ シ ス セ ソ タ チ ツ テ ト ナ ニ ヌ ネ ノ ハ ヒ フ ヘ ホ マ ミ ム メ モ ヤ ユ ヨ ラ リ ル レ ロ ワ ヲ ン)], 
    "KATAKANA IROHA" => 
     [qw(イ ロ ハ ニ ホ ヘ ト チ リ ヌ ル ヲ ワ カ ヨ タ レ ソ ツ ネ ナ ラ ム ウ ヰ ノ オ ク ヤ マ ケ フ コ エ テ ア サ キ ユ メ ミ シ ヱ ヒ モ セ ス)], 
    "HIRAGANA IROHA" => 
     [qw(い ろ は に ほ へ と ち り ぬ る を わ か よ た れ そ つ ね な ら む う ゐ の お く や ま け ふ こ え て あ さ き ゆ め み し ゑ ひ も せ す)], 
    "HALFWIDTH KATAKANA IROHA" => 
     [qw(イ ロ ハ ニ ホ ヘ ト チ リ ヌ ル ヲ ワ カ ヨ タ レ ソ ツ ネ ナ ラ ム ウ ノ オ ク ヤ マ ケ フ コ エ テ ア サ キ ユ メ ミ シ ヒ モ セ ス)], 

    "HANGUL CHOSUNG" => 
     [qw(ㄱ ㄴ ㄷ ㄹ ㅁ ㅂ ㅅ ㅇ ㅈ ㅊ ㅋ ㅌ ㅍ ㅎ)], 
    "HANGUL GANADA" => 
     [qw(가 나 다 라 마 바 사 아 자 차 카 타 파 하)], 
    "CHINESE ZODIAC 10" => 
     [qw(甲 乙 丙 丁 戊 己 庚 辛 壬 癸)], 
    "CHINESE ZODIAC 12" => 
     [qw(子 丑 寅 卯 辰 巳 午 未 申 酉 戍 亥)], 

    "ZODIAC" => [qw(♈ ♉ ♊ ♋ ♌ ♍ ♎ ♏ ♐ ♑ ♒ ♓ )], 

); 

for my $a (\%Alphabet) { 

    $$a{da} = $$a{no}; 
    $$a{fi} = $$a{no}; 

    $$a{de} = $$a{en}; 
    $$a{fr} = $$a{en}; 
    $$a{pt} = $$a{en}; 
} 


1; 

Questo dovrebbe certamente essere sufficiente per iniziare.

+0

Supponiamo che stavo elaborando un indice in francese e ho trovato una parola che inizia con é? Mi sembra, vorrei consultare la tabella hash sopra, e imparare che non c'era "é" nella lista per il francese. (Poiché è lo stesso dell'elenco per l'inglese). Quindi il mio programma dovrebbe scoprire che "é" era solo una variante di "e". Puoi suggerire un approccio in Perl per farlo? – egilchri

+0

@egilchri Facile! Usa '@sorted_data = Unicode :: Collate :: Locale-> new (locale =>" fr ") -> sort (@data)'. Il modulo utilizza i dati CLDR ed è molto esteso. A proposito, il francese ordina accenti in modo diverso rispetto alla maggior parte delle altre lingue. – tchrist

+0

Quindi funziona alla grande, e finisco con un elenco di prime lettere: (A B C D E F H H L M P R S T V) Cosa mi dice che É dovrebbe essere collassato nella categoria E? (A proposito, questa roba finora funziona come un incantesimo, così tante grazie.) – egilchri

2

La pagina CLDR si parla descrive un approccio scopo di affrontare questioni di questo tipo, e dice: "Per CLDR 1.8, un set iniziale di caratteri indice è stato generato automaticamente" ma avverte: "ATTENZIONE: la generazione automatica sarebbe solo una bozza, affinchè i traduttori si sintonizzino, quindi eventuali difetti potrebbero essere corretti." Questo potrebbe spiegare la situazione se non è ancora possibile trovare supporto nei linguaggi di programmazione.

Ma immagino che si potrebbe ancora utilizzare i dati estraendolo direttamente da CLDR; è nei dati main, elemento <characters>, sottoelemento <exemplarCharacters> con type="index".

Per esempio, il locale Russo (ru) contiene lettere Е e Ё là, ma non credo che gli indici russi distinguono tra quelle lettere. Per il finlandese, V e W sono entrambi elencati qui, ma tradizionalmente non sono stati distinti (anche se questo sta cambiando). Per lo spagnolo, sono elencate solo le singole lettere, ma nella vecchia tradizione, la coppia LL (che denota un singolo suono) è una voce di indice. Quindi i dettagli potrebbero richiedere una messa a punto o potrebbero essere controversi, ma i dati CLDR sono ancora un utile punto di partenza.

Problemi correlati