2011-12-28 27 views
5

Tôi muốn có chỉ mục cho danh sách. Ví dụ danh sách liên lạc Android có #, A-Z. Nhưng đối với nhiều miền địa phương, điều này không bao gồm tất cả các ký tự địa phương cụ thể.Ký tự chỉ mục địa phương cụ thể

Hỗ trợ cho điều này bằng các ngôn ngữ lập trình khác nhau như thế nào? Tôi đã xem xét nhanh chóng và trong trường hợp của lõi Java Tôi không nhìn thấy bất cứ điều gì m

Hơi liên quan: http://cldr.unicode.org/development/development-process/design-proposals/index-characters

+0

FYI: bạn có thể hưởng lợi từ Khu vực 51 [đề xuất I18N & L10N] (http://area51.stackexchange.com/proposals/12416/i18n-l10n). – McDowell

Trả lời

3

Đây là câu hỏi hay về VERY!

Khi bạn lưu ý trong thẻ , điều quan trọng không phải là ngôn ngữ lập trình. Đó là tập dữ liệu bạn thực sự cần ở đây. Tôi biết không có kho lưu trữ cho những thứ như vậy. Dữ liệu do chưa chứa điều này. Dưới đây là một chuỗi các trình tự đơn giản cho các mã twosᴏ hai chữ cái khác nhau, cộng thêm một vài tính năng bổ sung cho các chuỗi châu Á, được viết bằng Perl. Loại điều này có thể là cơ sở của một mô-đun.

Nó yêu cầu xử lý hơi cẩn thận, vì bạn không thể chuẩn bị một cách mù quáng biểu đồ đầu tiên trong mỗi phần tử mà không quan tâm đến ngôn ngữ nếu bạn muốn một tập hợp "chữ hoa". Đó là vì vấn đề Turkic I. Tôi sẽ cài đặt các phương pháp để rút ra các chuỗi, và phát hiện những thứ như vậy nếu họ yêu cầu một cái gì đó trong các ngôn ngữ Turkic.

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; 

Điều đó chắc chắn sẽ đủ để bạn bắt đầu.

+0

Giả sử tôi đang xử lý chỉ mục bằng tiếng Pháp và tôi đã bắt đầu bằng một từ bắt đầu bằng é? Dường như với tôi, tôi sẽ tham khảo bảng băm của bạn ở trên, và biết rằng không có "é" trong danh sách cho tiếng Pháp. (Vì nó giống với danh sách cho tiếng Anh). Vì vậy, chương trình của tôi sẽ phải khám phá ra rằng "é" chỉ là một biến thể của "e". Bạn có thể đề xuất một cách tiếp cận trong Perl để làm điều đó không? – egilchri

+0

@egilchri Dễ dàng! Sử dụng '@sorted_data = Unicode :: Collate :: Locale-> new (locale =>" fr ") -> sắp xếp (@data)'. Module sử dụng dữ liệu CLDR và ​​rất rộng. BTW, các điểm nhấn tiếng Pháp khác với hầu hết các ngôn ngữ khác. – tchrist

+0

Vì vậy, điều này làm việc tuyệt vời, và tôi kết thúc với một danh sách các chữ cái đầu tiên: (A B C D C ả T ả T áN S ả T V) Điều gì nói với tôi rằng É nên ​​được sụp đổ vào thể loại E? (BTW, công cụ này cho đến nay là làm việc như một say mê, rất nhiều cảm ơn.) – egilchri

2

Trang CLDR bạn đề cập đến mô tả một cách tiếp cận nhằm giải quyết những câu hỏi như thế này, và nó nói: “Đối với CLDR 1.8, một bộ ký tự chỉ mục ban đầu đã được tạo tự động” nhưng cảnh báo: “CẢNH BÁO: thế hệ tự động sẽ chỉ là bản nháp, cho người dịch điều chỉnh, vì vậy bất kỳ thiếu sót nào cũng có thể được sửa.” Điều này có thể giải thích tình huống nếu bạn không thể tìm thấy hỗ trợ cho nó bằng ngôn ngữ lập trình.

Nhưng tôi cho rằng bạn vẫn có thể sử dụng dữ liệu bằng cách trích xuất trực tiếp từ CLDR; trong dữ liệu main, phần tử <characters>, subelement <exemplarCharacters> với type="index".

Ví dụ: ngôn ngữ Nga (ru) chứa chữ cái Е và Ё ở đó, nhưng tôi không nghĩ các chỉ mục Nga phân biệt giữa các chữ cái đó. Đối với Phần Lan, V và W đều được liệt kê ở đó, nhưng theo truyền thống thì chúng không được phân biệt (mặc dù điều này đang thay đổi). Đối với tiếng Tây Ban Nha, chỉ có các chữ cái duy nhất được liệt kê, nhưng trong truyền thống cũ, cặp LL (biểu thị một âm thanh duy nhất) là một mục chỉ mục. Vì vậy, các chi tiết có thể cần điều chỉnh hoặc có thể gây tranh cãi, nhưng dữ liệu CLDR vẫn là điểm khởi đầu hữu ích.

Các vấn đề liên quan