Κυριακή 14 Φεβρουαρίου 2016

Υποστήριξη διάφορων γλωσσών παραδείγματα.(νέο)

Η αναθεώρηση 161 έχει ελεγχθεί σε Windows  7-8-10 με Αγγλικά ως γλώσσα για πρόγραμμα με μη υποστήριξη Unicode, και τρέχει κανονικά (όπως έτρεχαν και οι παλαιότερες εκδόσεις αλλά μόνο με επιλογή εκεί τα Ελληνικά). Ουσιαστικά το πρόγραμμα m2000.exe αν και γραμμένο σε VB6, με ελληνικά ως τοπική γλώσσα, τρέχει σε οποιοδήποτε σύστημα. Επιπλέον υποστηρίζει οποιοδήποτε πληκτρολόγιο. Δεν έχει σχεδιαστεί όμως για γλώσσες με άλλο προσανατολισμό (π.χ από δεξιά προς αριστερά) αν και η εντολή Αναφορά μπορεί να εμφανίσει τέτοιο κείμενο, και ο διορθωτής επίσης, αλλά στον διορθωτή αν μαρκάρουμε κείμενο..μας εμφανίζεται αντεστραμμένο! (Δεν έχω εμπειρία από τέτοιες γλώσσες οπότε προς το παρόν το αφήνω έτσι).

Σε αυτό το παράδειγμα θα δούμε πως θα μπορέσουμε σε έναν υπολογιστή να δούμε αν έχει Ελληνικά για υποστήριξη μη Unicode προγραμμάτων. Αν και η Μ2000 έχει υποστήριξη για οποιαδήποτε γλώσσα, υπάρχει λόγος να γνωρίζουμε αν το ANSI (οι 8 bit χαρακτήρες) είναι το ελληνικό ή όχι.

Για τους χαρακτήρες η Μ2000 έχει πέντε συναρτήσεις, η μια εκ των οποίων είναι γενική για αρκετές δουλειές, ανάλογα με τις παραμέτρους που παίρνει.

Υπάρχουν οι συναρτήσεις των χαρακτήρων των 8 Bit. Δείτε τι γίνεται εσωτερικά: Κάθε γράμμα γράφεται με δυο byte. Όμως αν το γράμμα έχει αντιστοίχιση στο 8bit -μη unicode σετ χαρακτήρων που ορίζεται από τον πίνακα ελέγχου (και απαιτεί επανεκκίνηση του συστήματος για να αλλάξει), τότε μας δίνει το αντίστοιχο νούμερο ή αλλιώς το νούμερο 63 που είναι το ερωτηματικό ?.

Σε έναν υπολογιστή με Windows 7, Αγγλικά, με επιλογή γλώσσας Ελληνικά και επιλογή γλώσσας προγραμμάτων που δεν υποστηρίζουν unicode τα Αγγλικά η παρακάτω συνάρτηση δίνει για το Γ το G (71).  (ομαδοποιώ τις επιλογές: Αγγλικά-Ελληνικά-Αγγλικά)
Τύπωσε κωδ("Γ")
Αν δώσουμε το παραπάνω στον ίδιο υπολογιστή με τη τελευταία επιλογή Ελληνικά θα πάρουμε άλλο νούμερο, το 195.
Δεν είναι μόνο η αλλαγή στα νούμερα. Μερικοί χαρακτήρες δεν έχουν μήκος! Π,χ, στα ελληνικά το 255 είναι διάστημα χωρίς μήκος! Η Μ2000 μετράει το μήκος και αν το μήκος είναι μηδέν σε έναν χαρακτήρα τότε εμφανίζει τον χαρακτήρα πάνω στον άλλο. Έτσι το μήκος ενός αλφαριθμητικού μπορεί να μην αντιστοιχεί στο μήκος του εμφανιζόμενου αλφαριθμητικού. Μπορούμε να το μάθουμε αυτό με δυο συναρτήσεις:
Α$="Γιω̃ργος"
Τύπωσε Α$, Μήκος(Α$), Μήκος.εμφ(Α$)
θα μας δώσει:
Γιω̃ργος  8  7
η περισπωμένη μπήκε με Alt + 303, αφού δώσαμε το ω (πατάμε και το + το αφήνουμε και μετά το 303, έτσι περνάμε δεκαεξαδικά νούμερα και τα κάνουμε χαρακτήρες, θα μπορούσαμε να δώσουμε Alt 771 είναι το ίδιο). Με BackSpace σβήνουμε μόνο τη περισπωμένη (αφού είναι χωριστός χαρακτήρας). Μπορούμε να τυπώνουμε δεκαεξαδικά νούμερα (εκτός περιοχής των 32bit μη αρνητικών, εμφανίζει τιμές λάθους).
Δεκαεξ 771

Μπορούμε να δούμε το γράμμα "Γ" τι αριθμό Unicode έχει. Μπορούμε να δώσουμε τον αριθμό και να πάρουμε το γράμμα.

Τύπωσε χαρκωδ("Γ")
Τύπωσε χαρκωδ$(915), χαρκωδ$(χαρκωδ("Γ"))
Τύπωσε "Γιω"+χαρκωδ$(0x303)+"ργος"

Ομοίως για χαρακτήρες που υπάρχουν στο 8bit σετ (δείτε στην ομάδα γλωσσών για την τρίτη επιλογή), μπορούμε να έχουμε τη μετατροπή;

Τύπωσε Χαρ$(Κωδ("C")), Κωδ("C")

Τυπώνει το C και το 67

Η παρακάτω συνάρτηση μας λέει αν τα windows υποστηρίζουν Ελληνικά σε προγράμματα με μη χρήση Unicode χαρακτήρων.
Συνάρτηση ΥποστήριξηΕλληνικώνΜηUnicodeΠρογραμμάτων { =κωδ("Γ")=195}
Τύπωσε ΥποστήριξηΕλληνικώνΜηUnicodeΠρογραμμάτων() \\ 0 αν δεν υπάρχει υποστήριξη


Η σύνθετη γραφή$() και η Χαρ$() κάνουν και άλλες εργασίες:
Τύπωσε "αριθμός σε γράμματα, βάζει ένα διάστημα εξ ορισμού στους μη αρνητικούς"+Γραφή$(10)
Τύπωσε Γραφή$(0,"+##.###;-##.###;Μηδέν")
Τύπωσε Γραφή$(Αληθής και Ψευδής,";Αληθής;Ψευδής;")
Τύπωσε Γραφή$(Αληθής η Ψευδής,"Αληθής;Ψευδής;")
Τύπωσε Γραφή$(Αληθής η Ψευδής,"\F\a\l\s\e;\T\r\u\e;")

Κανονικά η γραφή$ παίρνει δεύτερη παράμετρο αλφαριθμητικό και δηλώνει τρόπο μετατροπής της πρώτης παραμέτρου. Αν όμως δώσουμε νούμερο, εδώ το 1032, τότε κάνει το εξής,..αλλάζει τους Unicode χαρακτήρες (τα νούμερα) σε Ansi του "τοπικού" 1032 που είναι για την Ελλάδα. Αν ο χαρακτήρας που πιθανόν υπάρχει στην πρώτη παράμετρο και δεν έχει αντιστοιχία σε στο ANSI θα γίνει 63 δηλαδή ερωτηματικό. Τι θα τυπώσουμε όμως; Αυτό που επιστρέφει η γραφης$() είναι Unicode, και τα νούμερα είναι από το 255 και κάτω, άρα θα επιστρέψει Unicode χαρακτήρες. και εδώ τους βλέπουμε.  Με την χαρ$() παίρνουμε τα νούμερα και τα αλλάζουμε σε εκείνα που υποδηλώνει το "τοπικό", το 1032 που είναι για την Ελλάδα.  Αν αντί για το "Γιώργος" έχω βάλει κάτι ανάμεικτο, π.χ. ρώσικα γράμματα, τότε θα πάρω στα ρώσικα ???... και στην μετατροπή θα παραμείνουν ???....Το μήκος του αλφαριθμητικού δεν αλλάζει (Αφού είναι unicode).

Τύπωσε γραφη$("Γιώργος",1032) \\ Ãéþñãïò
Τύπωσε χαρ$(γραφη$("Γιώργος",1032), 1032)

Στο παρακάτω παράδειγμα κάνουμε κάτι εξαιρετικό: Φτιάχνουμε ένα A$ με τρεις χαρακτήρες που περιέχουν το "Γιώργος". Επειδή παράχθηκε το m2000.exe με ελληνική υποστήριξη σε μη unicode προγράμματα, οι ρουτίνες μετατροπής δουλεύουν για ελληνικά άψογα. Αλλά δεν είναι πρόβλημα ακόμα και για Ρωσικά!

α$=γραφη$("Γιώργος")
α=χαρκωδ(μεσ$(α$,1,1))
Τύπωσε Δυαδικό.Ακέραιο(α) υπολ 0χ100
Τύπωσε χαρ$(α$), μήκος(α$)

Και εδώ για Ρωσικά: (δηλαδή δίνουμε ένα αλφαριθμητικό 24 χαρακτήρων και φτιάχνουμε ένα των 12 που έχει μέσα 24 ANSI χαρακτήρες, του οποίους δέχεται το σύστημα σαν ελληνικά, ενώ δεν είναι, και να τι σημαίνει...τα δεδομένα ορίζονται όπως εμείς θέλουμε).
Η ρουτίνα γραφή$() με αλφαριθμητικό μόνο μετατρέπει από Unicode (που είναι 2 bytes ο χαρακτήρας) σε Ansi (με 1 byte o χαρακτήρας) και η χαρ$() με αλφαριθμητικό μόνο μετατρέπει από Ansi σε unicode - διπλασιάζοντας τα byte)

Ρωσικά$="Привет игровая площадка!"
Α$=γραφη$(χαρ$(γραφη$(Ρωσικά$,1049) ,1032))
Τύπωσε Μήκος(Α$), Μήκος(Ρωσικά$) \\  12         24
Τύπωσε χαρ$(γραφη$(χαρ$(Α$),1032),1049)

Το 1049 είναι το "τοπικό" για τα ρώσικα. Ενώ το 1032 το "τοπικό" για τα Ελληνικά.

Υπάρχει ολόκληρη σελίδα με τα τοπικά. Για κάθε περίπτωση τρία νούμερα βρίσκονται:
Το νούμερο του τοπικού, το νούμερο της κωδικοσελίδας (ενδέχεται μια χώρα να έχει δυο ή περισσότερες κωδικοσελίδες), και κωδικός χαρακτήρων. Υπάρχουν γραμματοσειρές που αναφέρονται σε κάποιο κωδικό όπως ο 161 είναι ο κωδικός για τα ελληνικά, όμως όχι τα πολυτονικά. Υπάρχουν γραμματοσειρές Unicode που έχουν χιλιάδες γράμματα-σύμβολα, οπότε εκεί το νούμερο των χαρακτήρων δεν παίζει ρόλο. Οι φόρμες των παραθύρων των προγραμμάτων που χρησιμοποιούν στοιχεία ελέγχου (textbox) που δεν είναι Unicode, χρησιμοποιούν τον αριθμό χαρακτήρων (charcode). Αν επιλέξουμε γραμματοσειρά που δεν υποστηρίζει συγκεκριμένους χαρακτήρες από το σύνολο του Unicode τότε παίρνουμε τετραγωνάκι! Άρα σήμερα μάθαμε ότι τα τετραγωνάκια ανάμεσα σε γράμματα είναι σφάλμα γραμματοσειράς, ενώ τα ερωτηματικά σφάλμα μετατροπής από Unicode σε Ansi.

Τι κερδίζει το σύστημα με το  να ξέρει ότι έχει τοπικό το 1032; Η γλώσσα Μ2000 μπορεί να αλλάζει το τοπικό, όχι για να αλλάζει κάτι στην εμφάνιση, αλλά για να αλλάζει την ανάγνωση του πίνακα στοιχείων κάθε γλώσσας! Δίνει αρκετές πληροφορίες, για το πώς χωρίζονται οι αριθμοί για παράδειγμα (αν παίρνουν τελεία ή κόμμα για υποδιαστολή κ.α.).
Υπενθυμίζω ότι η εντολή Έγγραφο αναβαθμίζει ένα αλφαριθμητικό σε κείμενο, και το ίσον κάνει συμπλήρωση (append), όχι αντικατάσταση. Μπορούμε να σβήσουμε το έγγραφο με Καθαρό Α$. Αν θέλουμε να είναι τοπικό (και προσωρινό) τότε πρώτα ορίζουμε ένα τοπικό αλφαριθμητικό και μετά το αναβαθμίζουμε. Αλλιώς δεν χρειάζεται. Εδώ αν δεν το ορίζαμε τοπικό και υπήρχε πριν την εντολή φόρμα  Α$=""  τότε η εντολή έγγραφο θα τις έκανε αναβάθμιση (πράγμα που την δεύτερη και τρίτη φορά δεν θα το έκανε, αφού θα ήταν ήδη), και έτσι κάθε φορά θα συμπληρώνονταν τα παλιά με τα νέα. Αυτά συμβαίνουν γιατί οι ρουτίνες βλέπουν όλες τις μεταβλητές σαν μεταβλητές του τμήματος, ενώ ότι νέο φτιάχνουν, το σβήνουν. Αν δεν είχαμε (που εδώ δεν έχουμε) μια A$ τότε μπορούμε να σβήσουμε την Τοπική Α$ και να καλέσουμε όσες φορές θέλουμε την ΔείξεΤοπικα() (πάντα με πεζά-κεφαλαία-τόνους όπως τους έχουμε - ισχύει για τις ρουτίνες και τις ετικέτες για τις ΠΡΟΣ και ΔΙΑΜΕΣΟΥ),

φόρμα 80,40
τοπικό 1032
ΔείξεΤοπικα()
τοπικό 1031
ΔείξεΤοπικα()
τοπικό 1049
ΔείξεΤοπικα()
Ρουτίνα ΔείξεΤοπικα()
      Τοπική Α$
      Έγγραφο Α$
      για ι=0 έως 122 {
           Α$=Γραφή$(ι,"\[0\] ")+Τοπικό$(ι)+", "
      }
           Α$=Γραφή$(ι,"\[0\] ")+Τοπικό$(ι)
      Αναφορά Α$
      τύπωσε τοπικό, κωδικοσελίδα, χαρακτήρες \\ 1032 - 1253 - 161
Τέλος Ρουτίνας



Ας πούμε λοιπόν πως θέλουμε να μετατρέψουμε την σημερινή μέρα (όποια είναι π.χ. Κυριακή) στην αντίστοιχη Γερμανική (μάλιστα κρατάμε το τοπικό σε αυτό που ήταν, πρόσκαιρα σε μια μεταβλητή). Επειδή η γραφή$() με το "w" γυρνάει τον αριθμό μέρας από το 1 για την Κυριακή ενώ ο πίνακας ονομάτων ξεκινάει από Δευτέρα, κάνω την μετατροπή με εφαρμογή τύπου. Για να γίνει κατανοητός ο τύπος (τέτοια κάνουν οι προγραμματιστές):
Τύπωσε (τιμη(γραφη$(σημερα,"w"))+5) υπόλοιπο 7+1
Τύπωσε (1+5) υπόλοιπο 7+1 ' Κυριακή δίνει 1 θα πάρουμε 7
Τύπωσε (7+5) υπόλοιπο 7+1 ' Σάββατο δίνει 7 θα πάρουμε 6
Τύπωσε (2+5) υπόλοιπο 7+1 ' Δευτέρα δίνει 2 θα πάρουμε 1

Όπως βλέπουμε παρακάτω δεν έχουμε βάλει 1 αλλά 42 αφού ξεκινάμε από το 42
Ο τελεστής ΥΠΟΛΟΙΠΟ μπορεί να γραφτεί και ΥΠΟΛ ή αγγλικά MOD.
Η ακέραια διαίρεση στη Μ2000 είναι η ΔΙΑ ή DIV.
Οι ημερομηνίες-ώρες μετατρέπονται σε αριθμούς. Τα δεκαδικά είναι ώρες, οι ακέραιες τιμές μέρες. Έτσι το Ημέρα("10-12-2016")+1 θα δίνει την επόμενη μέρα. Υπάρχει το Ημέρα$() για να μας δείξει την ημέρα, αλλά χρησιμοποιεί τα ελληνικά.
Μπορούμε να χρησιμοποιήσουμε το τοπικό.
Τύπωσε γραφη$(σήμερα,τοπικο$(31))


Συνάρτηση Ημέρα_στα_Γερμανικά$ {
      κ=τοπικό
      τοπικό 1031
      Διάβασε Α
      =τοπικό$((τιμη(γραφη$(Α,"w"))+5) υπόλοιπο 7+42)
      τοπικό κ
}
Τύπωσε Ημέρα_στα_Γερμανικά$(Σήμερα)
Τύπωσε Ημέρα_στα_Γερμανικά$(Ημέρα("10-12-2016"))


Συνάρτηση Μήνας_στα_Γερμανικά$ {
      κ=τοπικό
      τοπικό 1031
      Διάβασε Α
      =τοπικό$(τιμη(γραφη$(Α,"m"))+55)
      τοπικό κ
}
Α=Σήμερα
Day$=Ημέρα_στα_Γερμανικά$(Α)
Month$=Μήνας_στα_Γερμανικά$(Α)
Τύπωσε Μορφή$("{0}, {1} {2} {3}", Day$, γραφη$(Α,"d"), Month$, γραφη$(Α,"yyyy"))




Τέλος εδώ είναι και ο τρόπος να σώσουμε αρχεία. Δείτε το παράδειγμα 4 όπου σώνουμε σε Ansi Ρωσικό, κάνοντας εξαγωγή σε unicode ενώ δίνουμε ansi, και διαβάζοντάς το ως ansi (χωρίς το λεκτικό ΕΥΡΕΙΑ).
Ενσωματώθηκε η συνάρτηση που βλέπει αν υπάρχει υποστήριξη για unicode στα Ελληνικά, ώστε να μπορέσουμε σε αυτή την περίπτωση να φέρουμε τα Ρωσικά στο Παράδειγμα 4 σωστά, στο διάβασμα.

\\ Παράδειγμα 1
κ=1
\\ αρχείο unicode με διαχωρισμό εξαγωγής σε αριθμούς-γράμματα
\\ https://en.wikipedia.org/wiki/Comma-separated_values
Άνοιξε "αλφα.cvs" για ευρεία εξαγωγή ως κ
Γράψε #κ, "Ένα όνομα", 100, 3213, "Привет игровая площадка!"
Κλείσε #κ
Αναμονή 100
Άνοιξε "αλφα.cvs" για ευρεία εισαγωγή ως κ
Ενώ όχι Τέλος(#κ) {
      Εισαγωγή #κ, Α$,Α, Β, Β$
      Τύπωσε Α$,Α, Β, Β$
}
Κλείσε #κ
\\ Παράδειγμα 2
κ=1
\\ χωρίς χρήση BOM (ενδεικτικού χαρακτήρα)
Άνοιξε "αλφα.txt" για ευρεία εξαγωγή ως κ
Τύπωσε #κ, "Γεια χαρά ! == Привет игровая площадка!"
Κλείσε #κ
Αναμονή 100
Άνοιξε "αλφα.txt" για ευρεία εισαγωγή ως κ
Ενώ όχι Τέλος(#κ) {
      Γραμμή Εισαγωγής #κ, Α$
      Τύπωσε Α$
}
Κλείσε #κ
\\ Παράδειγμα 3
κ=1
\\ με χρήση BOM (ενδεικτικού χαρακτήρα)
Άνοιξε "αλφα.txt" για ευρεία εξαγωγή ως κ
Τύπωσε #κ, χαρκωδ$(0xFEFF)+"Γεια χαρά ! == Привет игровая площадка!"
Κλείσε #κ
Αναμονή 100
Άνοιξε "αλφα.txt" για ευρεία εισαγωγή ως κ
Ενώ όχι Τέλος(#κ) {
      Γραμμή Εισαγωγής #κ, Α$
      Τύπωσε Μεσ$(Α$,2)
}
Κλείσε #κ


Συνάρτηση ΥποστήριξηΕλληνικώνΜηUnicodeΠρογραμμάτων { =κωδ("Γ")=195}
\\ Παράδειγμα 4
κ=1
\\ Σώσιμο κειμένου Ρωσικού σε Ansi
Άνοιξε "Ρωσικά.txt" για ευρεια εξαγωγή ως κ
Τύπωσε #κ, γραφη$(χαρ$(γραφη$("Привет игровая площадка!",1049) ,1032));
Κλείσε #κ
Αναμονή 100
Άνοιξε "Ρωσικά.txt" για εισαγωγή ως κ
Ενώ όχι Τέλος(#κ) {
      Γραμμή Εισαγωγής #κ, Α$
      Αν ΥποστήριξηΕλληνικώνΜηUnicodeΠρογραμμάτων() τότε {
      Τύπωσε χαρ$(γραφη$(Α$,1032),1049)
      } Αλλιώς {
      Τύπωσε χαρ$(Α$,1049)
      }
}
Κλείσε #κ


Δεν υπάρχουν σχόλια:

Δημοσίευση σχολίου

You can feel free to write any suggestion, or idea on the subject.