2009/7/16 Jennie Petoumenou <epetoumenou [ at ] gmail [ dot ] com>: > Σόρι, αγνοήστε το προηγούμενο, πάτησα αποστολή κατά λάθος. > > 2009/7/16 Jennie Petoumenou <epetoumenou [ at ] gmail [ dot ] com> >> >> >> 2009/7/16 Simos Xenitellis <simos [ dot ] lists [ at ] googlemail [ dot ] com> >>> >>> Κάνω μια γενικότερη περίληψη για το θέμα με το τελικό σίγμα >>> και όλα τα βήματα που χρειάζεται για να επιλύσουμε το θέμα. >>> >>> Στην ελληνική διάταξη στο X.Org (Linux) είχαμε πάντα το πρόβλημα, όταν >>> το CapsLock >>> ήταν πατημένο και πατούσαμε «ς», να παίρνουμε «ς» αντί το κεφαλαίο «Σ». >>> Μπορείτε να το δοκιμάσετε και να επιβεβαιώσετε τώρα· >>> 1. Πατήστε CapsLock >>> 2. Γράψτε ελληνικά, π.χ. ΣΔΛΚΦΞΕΟΡΙΞΓ >>> 3. Πατήστε «ς» και λαμβάνετε «ς» αντί για Σ. >>> >>> Η πηγή του προβλήματος είναι στον τρόπο που ο κώδικας του X.Org >>> αξιολογεί πότε ένας χαρακτήρας >>> είναι αλφαβητικός, ώστε για να το επιτρέπει να λειτουργεί το CapsLock. >>> Ως τώρα, το X.Org βλέπει τους χαρακτήρες στη διάταξη, π.χ. το γ και Γ >>> που είναι στο ίδιο πλήκτρο, >>> και δοκιμάζει τη μετατροπή κεφαλαίο προς πεζό για «Γ». Αν πράγματι >>> βγάλει «γ», τότε είναι αλφαβητικός χαρακτήρας >>> και έχει και σωστή αντιστοιχία πεζού-κεφαλαίου, οπότε ενεργοποιεί τη >>> λειτουργία CapsLock. >>> >>> Το «Σ» παράγει «σ», οπότε το ς/Σ αγνοείται όταν έχουμε πατημένο το >>> CapsLock και παράγει μόνο «ς». >>> >>> Η πηγή του προβλήματος είναι ότι θα ήταν καλύτερο να ελέγχαμε απλά αν >>> οι χαρακτήρες είναι απλά αλφαβητικοί αντί να επιβεβαιώνουμε ότι με >>> κάποιο τρόπο ότι η μετατροπή από πεζό σε κεφαλαίο (και ανάποδα). >>> Όπως είναι τώρα το X.Org δεν έχει ούτως ή άλλως τη δυνατότητα για >>> σωστή επιβεβαίωση για πεζά/κεφαλαία διότι δεν περιλαμβάνει στις >>> εξαρτήσεις κάποια βιβλιοθήκη Unicode. >>> >>> Έτσι, αρκεί να γράψουμε μια συνάρτηση σε γλώσσα C που να μπορεί να >>> λέει αν ένας χαρακτήρας Χ είναι αλφαβητικός ή όχι. >>> Στο πρότυπο Unicode έχουμε μια σειρά από βασικούς χαρακτήρες με κωδικό >>> από 0-65535, και περιγράφονται στο αρχείο >>> http://unicode.org/Public/UNIDATA/UnicodeData.txt (είναι αρχείο CSV). >>> Όπως αναφέρθηκε παραπάνω στη συζήτηση, ένα από τα πεδία του CSV είναι >>> Ll/Lu (Letter Lower, Letter Upper), οπότε χρειάζεται ένα πρόγραμμα >>> εντολών που να κάνει «parsing» το CSV και να ελέγχει αν πρόκειται για >>> Ll ή Lu, και να παράγει ένα πίνακα της μορφής >> >> Είχα γράψει στο προηγούμενο μέιλ: >>> >>> Σύμφωνα με το Unicode5.1.0 - clarification of lowercase and uppercase, το >>> τρίτο πεδίο κάθε κειμένου είναι Lu για κεφαλαία, Ll για πεζά, και >>> διαφορετικό για άλλους χαρακτήρες. >>> Νομίζω όμως ότι το πιο αξιόπιστο κριτήριο είναι ότι για τους πεζούς >>> χαρακτήρες το 13ο και το 15ο πεδίο κάθε εγγραφής περιέχει το κεφαλαίο που >>> αντιστοιχεί στον χαρακτήρα. Αντίστοιχα, για τα κεφαλαία, το 14ο πεδίο >>> περιέχει το πεζό γράμμα που τους αντιστοιχεί. Μια τέτοια κατάταξη καλύπτει >>> π.χ. το τελικό σίγμα: >>> 03C2;GREEK SMALL LETTER FINAL SIGMA;Ll;0;L;;;;;N;;;03A3;; >>> 03A3 >>> ενώ δεν καλύπτει π.χ. αυτά: >>> 1D703;MATHEMATICAL ITALIC SMALL THETA;Ll;0;L;<font> 03B8;;;;N;;;;; >>> 1D704;MATHEMATICAL ITALIC SMALL IOTA;Ll;0;L;<font> 03B9;;;;N;;;;; >> >> Δηλαδή, δεν αρκεί να διαπιστώσει κανείς αν ένας χαρακτήρας είναι π.χ. >> αλφαβητικός και πεζός, πρέπει να επαληθεύσει και ότι έχει κεφαλαίο που να >> του αντιστοιχεί. Γιατί π.χ. το ελληνικό θ ως μαθηματικό σύμβολο σε αγγλική >> διάταξη πληκτρολογίου, δεν διαθέτει αντίστοιχο κεφαλαίο. >> >> Είπα να τσεκάρω και το αντίστροφο: >> Αν ένας έχει συμπληρωμένο το 13ο/15ο πεδίο, είναι οπωσδήποτε πεζός >> αλφαβητικός; Η απάντηση είναι όχι. Παράδειγμα: >> 0345;COMBINING GREEK YPOGEGRAMMENI;Mn;240;NSM;;;;;N;GREEK NON-SPACING IOTA >> BELOW;;0399;;0399 >> (Προφανώς, η υπογεγραμμένη δεν μπορεί να γίνει κεφαλαίο). >> >> Κάτι τελευταίο: >> Αν ο χαρακτήρας είναι πεζός αλφαβητικός, το κεφαλαίο του είναι στο 13ο ή >> 15ο πεδίο; >> Η απάντηση είναι: στο 13ο. >> Στο παρακάτω παράδειγμα, το 01C6 (dž) έχει το 01C4 (DŽ) στο 13ο πεδίο, και >> το 01C5 (Dž) στο 15ο. Άρα, το 13ο πεδίο ορίζει τη συμπεριφορά του capslock >> (αυτό μας ενδιαφέρει), και το 15ο του shift. >>> >>> 01C4;LATIN CAPITAL LETTER DZ WITH CARON;Lu;0;L;<compat> 0044 >>> 017D;;;;N;LATIN CAPITAL LETTER D Z HACEK;;;01C6;01C5 >>> 01C5;LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH >>> CARON;Lt;0;L;<compat> 0044 017E;;;;N;LATIN LETTER CAPITAL D SMALL Z >>> HACEK;;01C4;01C6;01C5 >>> 01C6;LATIN SMALL LETTER DZ WITH CARON;Ll;0;L;<compat> 0064 >>> 017E;;;;N;LATIN SMALL LETTER D Z HACEK;;01C4;;01C5 >>> >>> Από τη wikipedia (I know, αξιόπιστη πηγή): >>> Dž (titlecase form; all-capitals form DŽ, lowercase dž) >> >> >> Συμπερασματικά, εγώ νομίζω ότι οι έλεγχοι στη συνάρτηση πρέπει να είναι ως >> εξής: >> >>> >>> >>> >>> static void >>> UCSIsAlphabetic( register unsigned codepoint) >>> { >> >> Αντί για αυτό: >>> >>> /* Check if character is alphabetic, as in Unicode Data version 5.1.0 >>> */ >>> /* NB: Checks if character is either Ll or Lu (Letter lower/upper). >>> */ >> >> /*Check if character is alphabetic, and if its corresponding opposite case >> character exists */ >> /*If 3rd field is Ll, 13th field must be non-void*/ >> /*If 3rd field is Lu, 14th field must be non-void*/ >> if (character is Ll && field13 != void) >> return 1; >> else if (character is Lu && field14 != void) >> >> return 1; >> >> else >> >> return 0; Έφτιαξα ένα απλό πρόγραμμα που υλοποιεί τα παραπάνω, http://github.com/simos/extract-alphabetic και βρίσκει 1935 έγκυρους χαρακτήρες. Πρέπει να είναι σχετικά εύκολο να δοκιμάσει κάποιος το παραπάνω πρόγραμμα. Αν υπάρχουν σχόλια για την ορθότητα των αποτελεσμάτων, παρακαλώ σχολιάστε, ή και συνεχίστε με τα επόμενα βήματα. Σίμος >>> >>> /* Currently using flat array where index corresponds to codepoint >>> value. */ >>> /* Value is 1 if codepoint is alphabetic, 0 otherwise. */ >>> >>> static unsigned char const UCSAlphabetic[] = { >>> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, >>> ... >>> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, >>> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 >>> }; >>> >>> if ( UCSAlphabetic[codepoint] == 0 ) >>> return 0; >>> else >>> return 1; >>> } >>> >>> Τη συνάρτηση αυτή την προσθέτουμε στο ίδιο αρχείο με >>> http://cgit.freedesktop.org/xorg/lib/libX11/tree/src/KeyBind.c#n294 >>> >>> Έχοντας τη συνάρτηση αυτή, τότε είμαστε σε θέση να τροποποιήσουμε τον >>> κώδικα στο >>> http://bugs.freedesktop.org/show_bug.cgi?id=22145#c11 >>> ώστε να κοιτάει αν απλά οι χαρακτήρες sym[0], sym[1] (και sym[2], >>> sym[3]) είναι αλφαβητικοί. >>> >>> Σίμος >>> >>> 2009/6/13 Simos Xenitellis <simos [ dot ] lists [ at ] googlemail [ dot ] com>: >>> > 2009/6/13 Savvas Radevic <vicedar [ at ] gmail [ dot ] com>: >>> >> Το UnicodeData.txt είναι και σωστά διαμορφωμένο, δείχνει το αντίστοιχο >>> >> κεφαλαίο γράμμα δίπλα από κάθε μικρό (και vice versa): >>> >> >>> >> 03A1;GREEK CAPITAL LETTER RHO;Lu;0;L;;;;;N;;;;03C1; >>> >> 03A3;GREEK CAPITAL LETTER SIGMA;Lu;0;L;;;;;N;;;;03C3; >>> >> >>> >> 03C1;GREEK SMALL LETTER RHO;Ll;0;L;;;;;N;;;03A1;;03A1 >>> >> 03C2;GREEK SMALL LETTER FINAL SIGMA;Ll;0;L;;;;;N;;;03A3;;03A3 >>> >> 03C3;GREEK SMALL LETTER SIGMA;Ll;0;L;;;;;N;;;03A3;;03A3 >>> >> >>> >> Προσέξτε το "03A3;;03A3" στο "FINAL SIGMA" και "SIGMA". >>> >> Επίσης, τα κεφαλαία το έχουν το αντίστοιχο μικρό στην πρότελευταια >>> >> τιμή, ενώ >>> >> τα μικρά έχουν το αντίστοιχο κεφαλαίο >>> >> >>> >> Σύμφωνα με αυτό που πρόσθεσε η Jennie ("Lu" και "Ll"), επισύναψα ένα >>> >> καινούργιο sh/perl script: >>> >> >>> >> (Πρόσθεσα τα quotes "" στις τιμές για να φαίνεται η διαφορά) >>> >> Για κεφαλαία: >>> >>> >>> >>> perl -nle 'print if /^.*?;.*?;Lu;/' UnicodeData.txt | perl -pe >>> >>> 's/(.*?);(.*?);(.*?);.*;(.*?);$/"$1" "$3" "$4"/' >>> >>> >>> >>> "03A6" "Lu" "03C6" "GREEK CAPITAL LETTER PHI" >>> >>> "03A7" "Lu" "03C7" "GREEK CAPITAL LETTER CHI" >>> >>> "03A8" "Lu" "03C8" "GREEK CAPITAL LETTER PSI" >>> >>> "03A9" "Lu" "03C9" "GREEK CAPITAL LETTER OMEGA" >>> >>> "03AA" "Lu" "03CA" "GREEK CAPITAL LETTER IOTA WITH DIALYTIKA" >>> >>> "03AB" "Lu" "03CB" "GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA" >>> >>> "03CF" "Lu" "03D7" "GREEK CAPITAL KAI SYMBOL" >>> >>> "03D2" "Lu" "" "GREEK UPSILON WITH HOOK SYMBOL" >>> >>> "03D3" "Lu" "" "GREEK UPSILON WITH ACUTE AND HOOK SYMBOL" >>> >>> "03D4" "Lu" "" "GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL" >>> >> >>> >> Για μικρά: >>> >>> >>> >>> perl -nle 'print if /^.*?;.*?;Ll;/' UnicodeData.txt | perl -pe >>> >>> 's/(.*?);(.*?);(.*?);.*;(.*?)$/"$1" "$3" "$4" "$2"/' >>> >>> >>> >>> "03DF" "Ll" "03DE" "GREEK SMALL LETTER KOPPA" >>> >>> "03E1" "Ll" "03E0" "GREEK SMALL LETTER SAMPI" >>> >>> "03F0" "Ll" "039A" "GREEK KAPPA SYMBOL" >>> >>> "03F1" "Ll" "03A1" "GREEK RHO SYMBOL" >>> >>> "03F2" "Ll" "03F9" "GREEK LUNATE SIGMA SYMBOL" >>> >>> "03F3" "Ll" "" "GREEK LETTER YOT" >>> >>> >>> >>> [...] >>> >>> "1FE2" "Ll" "" "GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA" >>> >>> "1FE3" "Ll" "" "GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA" >>> >>> "1FE4" "Ll" "" "GREEK SMALL LETTER RHO WITH PSILI" >>> >>> "1FE5" "Ll" "1FEC" "GREEK SMALL LETTER RHO WITH DASIA" >>> >> >>> >> Τώρα μπορείτε εύκολα να βρείτε το αντίστοιχο κεφαλαίο/μικρό :) >>> > >>> > Νομίζω ότι έχουμε μια καλή εξέλιξη. >>> > Πράγματι, φαίνεται ότι τα LI, Lu, κτλ επιτρέπουν να βρίσκουμε τους >>> > αλφαβητικούς χαρακτήρες. >>> > >>> > Υπήρξε ένα ερώτημα προηγουμένως γιατί τα θέλουμε όλα αυτά. >>> > Ο λόγος είναι για να διορθώσουμε κάτι στο X.Org για τα ελληνικά (και >>> > μαζί με αυτό και για όλες τις άλλες γλώσσες). >>> > Η αναφορά σφάλματος που περιγράφει το ζήτημα είναι στο >>> > http://bugs.freedesktop.org/show_bug.cgi?id=22145 >>> > όπως έχει αναφερθεί ήδη. >>> > Αυτό που είναι σημαντικό είναι ότι προσωπικά δε θα ασχοληθώ με το >>> > ζήτημα τούτο. >>> > Αυτό που μπορώ να κάνω είναι να καθοδηγήσω κάποιους που θα ήθελαν να >>> > βοηθήσουν, >>> > και νομίζω ότι το όλο έργο είναι σχετικά βατό. >>> > >>> > Για τα >>> >>> "03DF" "Ll" "03DE" "GREEK SMALL LETTER KOPPA" >>> >>> "03E1" "Ll" "03E0" "GREEK SMALL LETTER SAMPI" >>> >>> "03F0" "Ll" "039A" "GREEK KAPPA SYMBOL" >>> >>> "03F1" "Ll" "03A1" "GREEK RHO SYMBOL" >>> >>> "03F2" "Ll" "03F9" "GREEK LUNATE SIGMA SYMBOL" >>> >>> "03F3" "Ll" "" "GREEK LETTER YOT" >>> > >>> > Θέλουμε να παράγουμε πίνακα >>> > >>> > int myarray[] = { >>> > >>> > 0x03DF, 1, // είναι αλφαβητικό >>> > 0x03E0, 0 >>> > 0x03E1, 1, >>> > 0x03E2, 0, >>> > 0x03E3, 0, >>> > 0x03E4, 0, >>> > 0x03E5, 0, >>> > ... >>> > 0x03F0, 1, >>> > 0x03F1, 1, >>> > 0x03F2, 1, >>> > 0x03F3, 1 >>> > }; >>> > >>> > Σίμος >>> > >>> _______________________________________________ >>> Open-source mailing list >>> Open-source [ at ] ellak [ dot ] gr > >