2009/7/16 Jennie Petoumenou epetoumenou@gmail.com:
Σόρι, αγνοήστε το προηγούμενο, πάτησα αποστολή κατά λάθος.
2009/7/16 Jennie Petoumenou epetoumenou@gmail.com
2009/7/16 Simos Xenitellis simos.lists@googlemail.com
Κάνω μια γενικότερη περίληψη για το θέμα με το τελικό σίγμα και όλα τα βήματα που χρειάζεται για να επιλύσουμε το θέμα.
Στην ελληνική διάταξη στο X.Org (Linux) είχαμε πάντα το πρόβλημα, όταν το CapsLock ήταν πατημένο και πατούσαμε «ς», να παίρνουμε «ς» αντί το κεφαλαίο «Σ». Μπορείτε να το δοκιμάσετε και να επιβεβαιώσετε τώρα·
- Πατήστε CapsLock
- Γράψτε ελληνικά, π.χ. ΣΔΛΚΦΞΕΟΡΙΞΓ
- Πατήστε «ς» και λαμβάνετε «ς» αντί για Σ.
Η πηγή του προβλήματος είναι στον τρόπο που ο κώδικας του 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.lists@googlemail.com:
2009/6/13 Savvas Radevic vicedar@gmail.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@ellak.gr
el-users@lists.fedoraproject.org