2011-12-28 9 views
5

Chciałbym mieć indeks dla listy. Na przykład lista kontaktów z Androidem ma numer #, A-Z. Ale w przypadku wielu lokalizacji nie obejmuje to wszystkich znaków charakterystycznych dla ustawień narodowych.Znaki indeksu specyficzne dla regionu

Jak jest obsługiwane w różnych językach programowania? Wziąłem szybki rzut oka, a w przypadku rdzenia Java nie widzę nic m

Nieco powiązanymi: http://cldr.unicode.org/development/development-process/design-proposals/index-characters

+0

FYI: może ci się przydać ten Obszar 51 [Propozycja I18N i L10N] (http://area51.stackexchange.com/proposals/12416/i18n-l10n). – McDowell

Odpowiedz

3

To jest BARDZO dobre pytanie!

Jak zauważysz w znaczniku , ważną rzeczą nie jest język programowania. Jest to zestaw danych, który naprawdę potrzebujesz tutaj. Nie znam żadnego repozytorium takich rzeczy. Dane do nie zawierają jeszcze tej rzeczy. Oto prosta tabela sekwencji dla różnych dwuliterowych kodów ɪsᴏ oraz kilka dodatków dla sekwencji azjatyckich, napisanych w Perlu. Tego rodzaju rzeczy mogą być podstawą modułu.

Wymaga to nieco starannej obsługi, ponieważ nie możesz na zasadzie ślepego zatytułowania pierwszego grafemu w każdym elemencie bez względu na ustawienia regionalne, jeśli chcesz ustawić "wielkie litery". To z powodu problemu Turkic I. Chciałbym zainstalować metody, które wyciągną sekwencje i wykryją takie rzeczy, jeśli proszą o coś w językach tureckich.

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; 

To z pewnością powinny być wystarczające, aby zacząć grę, choć.

+0

Załóżmy, że przetwarzałem indeks w języku francuskim i napotkałem słowo zaczynające się na é? Wydaje mi się, że skonsultowałbym twój tabelę mieszania powyżej i dowiedziałbym się, że nie ma "é" na liście dla francuskiego. (Ponieważ jest taki sam jak lista dla języka angielskiego). Tak więc mój program musiałby odkryć, że "é" to tylko wariant "e". Czy możesz zaproponować podejście w Perlu, aby to zrobić? – egilchri

+0

@egilchri Easy! Użyj '@sorted_data = Unicode :: Collate :: Locale-> new (locale =>" fr ") -> sort (@data)'. Moduł wykorzystuje dane CLDR i jest bardzo obszerny. BTW, francuski sortuje akcenty inaczej niż większość innych języków. – tchrist

+0

To działa świetnie, a ja mam listę pierwszych liter: Co mi mówi, że É powinien zostać zawalony do kategorii E? (BTW, te rzeczy do tej pory działają jak wdzięk, bardzo dziękuję.) – egilchri

2

Strona CLDR wspomnieć opisuje podejście mające na celu rozwiązanie takie pytania, a ona mówi: "W przypadku CLDR 1.8 początkowy zestaw znaków indeksu został automatycznie wygenerowany", ale ostrzega: "OSTRZEŻENIE: automatyczne generowanie byłoby tylko szkicem, aby tłumacze mogli dostrojenie, aby można było naprawić wszelkie niedociągnięcia." Może to wyjaśnić sytuację, jeśli: nie możesz jeszcze znaleźć wsparcia w językach programowania.

Ale przypuszczam, że nadal można korzystać z danych, wyodrębniając je bezpośrednio z CLDR; jest w danych main, element <characters>, podelement <exemplarCharacters> z type="index".

Na przykład rosyjski (ru) język zawiera litery Е i Ё tam, ale nie sądzę, że rosyjskie indeksy rozróżniają te litery. W przypadku fińskiego, V i W są tam wymienione, ale tradycyjnie nie zostały rozróżnione (choć to się zmienia). W przypadku języka hiszpańskiego wyświetlane są tylko pojedyncze litery, ale w starej tradycji para LL (oznaczająca pojedynczy dźwięk) jest pozycją indeksu. Tak więc szczegóły mogą wymagać strojenia lub mogą być kontrowersyjne, ale dane CLDR są nadal przydatnym punktem początkowym.

Powiązane problemy