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

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

  • Subject: Re: Πρόγραμμα εντολών που να μετατρέπει αρχείο
  • From: Jennie Petoumenou <epetoumenou [ at ] gmail [ dot ] com>
  • Date: Thu, 16 Jul 2009 21:14:58 +0200
Σόρι, αγνοήστε το προηγούμενο, πάτησα αποστολή κατά λάθος.

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
>
>
>