[Fedora-el-list] Re: [Open-source] Πρόγραμμα εντολών που να μετατρέπει αρχείο

Simos Xenitellis simos.lists at googlemail.com
Thu Jul 16 20:31:14 UTC 2009


2009/7/16 Jennie Petoumenou <epetoumenou at gmail.com>:
> Σόρι, αγνοήστε το προηγούμενο, πάτησα αποστολή κατά λάθος.
>
> 2009/7/16 Jennie Petoumenou <epetoumenou at gmail.com>
>>
>>
>> 2009/7/16 Simos Xenitellis <simos.lists at googlemail.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.lists at googlemail.com>:
>>> > 2009/6/13 Savvas Radevic <vicedar at 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 at ellak.gr
>
>




More information about the Fedora-el-list mailing list