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<http://www.unicode.org/versions/Unicode5.1.0/#Other_Changes>, > το τρίτο πεδίο κάθε κειμένου είναι 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<http://en.wikipedia.org/wiki/Capitalization#Digraphs_and_ligatures>form; all- > capitals <http://en.wikipedia.org/wiki/Capital_letters> form *DŽ*, > lowercase <http://en.wikipedia.org/wiki/Lower_case> *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) > > /* 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