2011-12-28 19 views
5

Me gustaría tener un índice para una lista. Por ejemplo, la lista de contactos de Android tiene #, A-Z. Pero para muchas configuraciones regionales esto no cubre todos los caracteres específicos de la configuración regional.Caracteres de índice específicos de configuración regional

¿Cómo es la compatibilidad con esto en diferentes lenguajes de programación? Tomé un vistazo rápido y en el caso del núcleo de Java no vi nada m

Poco relacionado: http://cldr.unicode.org/development/development-process/design-proposals/index-characters

+0

FYI: puede beneficiarse de este Área 51 [propuesta I18N y L10N] (http://area51.stackexchange.com/proposals/12416/i18n-l10n). – McDowell

Respuesta

3

Esto es MUY ¡buena pregunta!

Como observa en la etiqueta , lo importante no es el lenguaje de programación. Es el conjunto de datos que realmente necesitas aquí. No conozco ningún depósito para tales cosas. Los datos do aún no contienen esto. Aquí hay una tabla simple de secuencias para varios códigos twosᴏ de dos letras, más algunos extras para secuencias asiáticas, escritos en Perl. Este tipo de cosas podría ser la base de un módulo.

Requiere un manejo un tanto cuidadoso, ya que no se puede marcar ciegamente el primer grafema en cada elemento sin tener en cuenta la configuración regional si se desea un conjunto "en mayúsculas". Eso es por el problema de Turkic I. Instalaría métodos que extraen las secuencias y las detectaría si pidieran algo en las lenguas túrquicas.

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; 

Sin embargo, eso debería ser suficiente para empezar.

+0

Supongamos que estoy procesando un índice en francés, y encontré una palabra que comienza con é? Me parece que consultaría su tabla de hash anteriormente, y aprendería que no había "é" en la lista para el francés. (Dado que es lo mismo que la lista para inglés). Entonces mi programa debería descubrir que "é" era solo una variante de "e". ¿Puedes sugerir un enfoque en Perl para hacer eso? – egilchri

+0

@egilchri ¡Fácil! Use '@sorted_data = Unicode :: Collate :: Locale-> new (locale =>" fr ") -> sort (@data)'. El módulo usa los datos CLDR y es muy extenso. Por cierto, el francés ordena los acentos de manera diferente a la mayoría de los otros idiomas. – tchrist

+0

Así que esto funciona muy bien, y termino con una lista de primeras letras: (A B C D É É F G H I L M N O P R S T V) ¿Qué me dice que É debería colapsar en la categoría E? (Por cierto, esto hasta ahora funciona como un amuleto, muchas gracias.) – egilchri

2

La página CLDR mencionas describe un enfoque orientado a hacer frente a este tipo de preguntas, y dice: "Para CLDR 1.8, se ha generado automáticamente un conjunto inicial de caracteres de índice", pero advierte: "ADVERTENCIA: la generación automática solo sería un borrador, para que los traductores puedan sintonizar, por lo que cualquier inconveniente podría solucionarse". Esto podría explicar la situación si no puede encontrar soporte para esto en los lenguajes de programación todavía.

Pero supongo que aún podría utilizar los datos extrayéndolo directamente de CLDR; está en los datos main, elemento <characters>, subelemento <exemplarCharacters> con type="index".

Por ejemplo, la configuración regional rusa (ru) contiene letras Е y Ё, pero no creo que los índices rusos distingan entre esas letras. Para finlandés, V y W se enumeran allí, pero tradicionalmente no se han distinguido (aunque esto está cambiando). Para español, solo se enumeran las letras individuales, pero en la antigua tradición, el par LL (que denota un solo sonido) es una entrada de índice. Por lo tanto, es posible que los detalles necesiten ser ajustados o puedan ser controvertidos, pero los datos de CLDR aún son un punto de inicio útil.

Cuestiones relacionadas