Σόρι, αγνοήστε το προηγούμενο, πάτησα αποστολή κατά λάθος. 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<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) > return 1; > else > return 0; > > > > > >> >> /* 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 > > >