ΕΕΛ/ΛΑΚ - Λίστες Ταχυδρομείου

Re: Πρόγραμμα εντολών που να μετατρέπει αρχείο

  • Subject: Re: Πρόγραμμα εντολών που να μετατρέπει αρχείο
  • From: Jennie Petoumenou <epetoumenou [ at ] gmail [ dot ] com>
  • Date: Thu, 16 Jul 2009 21:10:34 +0200
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