Τετάρτη 5 Ιουλίου 2017

Αναθεώρηση 6 (Έκδοση 8.9)

Σε αυτήν την αναθεώρηση έκανα αρκετά πράγματα:
1)Τα αρχεία που φορτώνουμε σε έγγραφα έχουν αυτόματη αναγνώριση για UTF-8, ANSI, UTF16LE, UTF16ΒE. Σε αυτή την αναθεώρηση μπήκε για τα UTF16LE, UTF16ΒE η αναγνώριση χωρίς BOM (χωρίς δηλαδή κάποια στοιχεία στην αρχή του αρχείου). Γίνεται ανάγνωση κάποιων χαρακτήρων και εφαρμογή αλγόριθμου για εύρεση του συστήματος. Εσωτερικά τα έγγραφα λειτουργούν με UTF-16LE, οπότε γίνεται υποχρεωτικά αλλαγή, αν δεν διαβάσουμε στο ίδιο.
Κατά την αποθήκευση γνωρίζει το σύστημα τι κωδικοποίηση έχει το έγγραφο, αν θα γράψει ή όχι BOM, και το τρόπο αλλαγής γραμμών.
Μπορούμε να σώσουμε αν θέλουμε με το τρόπο που θέλουμε κάποιο έγγραφο, με η χωρίς BOM.


Εδώ φαίνεται πώς λειτουργεί η Μ2000 σε περίπτωση που θέλουμε να σώσουμε ANSI αρχεία. (τα δικά της, τα προγράματα δηλαδή, η M2000 τα χειρίζεται σε UTF-8). Δουλεύει είτε τα Windows έχουν είτε όχι την κωδικοσελίδα του συστήματος στα Ελληνικά
(Η Μ2000 τρέχει σε οποιοδήποτε υπολογιστή με Windows από XP και πάνω).

Συνάρτηση Ελλ$ (α$){
      \\ To 63 είναι το γνωστό ?
      Αν Κωδ("Π")=63 Τότε {
      \\ αν είναι άγνωστο το Π στο Ansi
      \\ τότε μετατρέπουμε τα ελληνικά
      \\ σε  Ansi νούμερα ενώ συνεχίζει να είναι UTF-16LE
      \\ έτσι ο κωδικός Γραφη$("Π", 1032) είναι ακριβώς στο νούμερο του Π σε Ελληνικό Ansi,
      \\ αλλά για την ώρα είναι σε UTF-16LE και δίνει άλλο χαρακτήρα στην Τύπωσε.
      \\ Μπορούμε να το δούμε με την ΧαρΚωδ(Γραφη$("Π", 1032)), όπου απλά η ΧαρΚωδ()
      \\ γυρνάει το νούμερο του Π όπως έχει διαμορφωθεί και είναι το 208
      \\ Όταν το σύστημα πάει να μετατρέψει το 208 σε ANSI θα το περάσει ως έχει, γιατί θα θεωρήσει
      \\ ότι είναι ο χαρακτήρας Χαρ$(208)
      \\ Όταν φορτώσουμε στο έγγραφο με το 1032, η Μ2000 με το 1032 και το 208 θα δώσει το Π
      \\ εκτελώντας το Χαρ$(208, 1032)
            =Γραφή$(α$, 1032)
       \\ αν γνωρίζει το νούμερο του Π η Κωδ() σημαίνει ότι
       \\ η κωδικοσελίδα του συστήματος είναι η Ελληνική.
       \\ άρα δίνουμε το αλφαριθμητικό ως έχει
      } Αλλιώς =α$
}
Τύπωσε $(0), "ok1"
Σημ 1 : ον$="" ' στην οθόνη
Σημ 2:
ον$="alfa11.txt"  
\\ αρχείο Ansi
\\ με την εντολή Monitor βλέπουμε ότι τη κωδικοσελίδα του συστήματος
\\ η 1252 δηλώνει ότι δεν είναι τα ελληνικά, είναι τα αγγλικά
\\ ενώ η 1253 δηλώνει ότι είναι τα ελληνικά
\\ Με τη 1253 η Άνοιξε όταν γράφει σε ANSI, γράφει με τα Ελληνικά!
\\ κάνει δηλαδή μετατροπή του UTF-16LE σε ANSI Ελληνικό
\\ αν όμως έχουμε την 1252 τότε πρέπει να μετατρέψουμε τα Ελληνικά σε ANSI
\\ και αυτό το κάνει η γραφή$ με το τοπικό της γλώσσας

Άνοιξε ον$ για εξαγωγή ως κ
Γράψε #κ, 1111.1111,.889,67, Ελλ$("Γιώργος")
Γράψε #κ,5678,"hello2",122334
Κλείσε #κ
Τύπωσε "ok2"
Αν ον$<>"" Τότε {
      Τύπωσε Αρχείου.Μήκος(ον$)
      Έγγραφο αα$
      \\ Ορίζουμε σε ποια γλώσσα θα γίνει η μετατροπή
      \\ θα αναγνωρίσει αυτόματα ότι είναι ANSI
      \\ αλλά χωρίς το 1032 δεν θα κάνει μετατροπή.
      Φόρτωσε.Έγγραφο αα$, ον$, 1032
      Αναφορά αα$
}
Τύπωσε $(0), "ok1"
Σημ 1 : ον$="" ' στην οθόνη
ον$="alfa11.txt"  
\\ Αρχείο UTF-16LE
Άνοιξε ον$ για ευρεία εξαγωγή ως κ
Γράψε #κ, 1111.1111,.889,67, "Ελληνικά"
Γράψε #κ,5678,"hello2",122334
Κλείσε #κ
Τύπωσε "ok2"
Αν ον$<>"" Τότε {
      Τύπωσε Αρχείου.Μήκος(ον$)
      Έγγραφο αα$
      Φόρτωσε.Έγγραφο αα$, ον$
      Αναφορά αα$
}

Έγγραφο Βήτα$
Βήτα$={Ελληνικά απευθείας στο έγγραφο
                        Άλλη παράγραφος
                        }
' Σώνουμε σε Ansi πιο εύκολα με τη Σώσε.Έγγραφο
Σώσε.Έγγραφο Βήτα$, "ελληνικό.txt", 1032
Καθαρό Βήτα$
Φόρτωσε.Έγγραφο Βήτα$,  "ελληνικό.txt", 1032
Αναφορά Βήτα$
\\ σώνουμε χωρίς BOM σε UTF-8, με 2 σώνουμε με BOM
Σώσε.Έγγραφο Βήτα$, "ελληνικό1.txt", -2
Σύστημα "Notepad.exe", Παράθεση$(Κατ$+"ελληνικό1.txt")
Σώσε.Έγγραφο Βήτα$, "ελληνικό2.txt", 2
Σύστημα "Wordpad.exe", Παράθεση$(Κατ$+"ελληνικό2.txt")
Σώσε.Έγγραφο Βήτα$, "ελληνικό3.txt", 1032
\\ μυστήριο... το Word βρήκε άμεσα το ANSI ελληνικό.
Σύστημα "WinWord", Παράθεση$(Κατ$+"ελληνικό3.txt")
Τύπωσε Αρχείου.Μήκος("ελληνικό1.txt") ' 88
Τύπωσε Αρχείου.Μήκος("ελληνικό2.txt") '91
Τύπωσε Αρχείου.Μήκος("ελληνικό3.txt")' 47 χαρακτήρες


ΣεWine σε linux δούλεψε. Αλλά υπάρχει μόνο το Notepad.exe και αυτό θέλει BOM και utf-8
Σώσε.Έγγραφο Βήτα$, "ελληνικό1.txt", 2
Σύστημα "Notepad.exe", Παράθεση$(Κατ$+"ελληνικό1.txt")

2) Ταξινόμηση σε Καταστάσεις και Έγγραφα:
Εκτός από την Κατάσταση Ουρά (που δέχεται όμοια κλειδιά) και δεν επιτρέπει ταξινόμηση, στις Καταστάσεις και στα Έγγραφα έχουμε δυνατότητα ταξινόμηση με εντολή (εκτελούνται παραλλαγές της quicksort).

Στις καταστάσεις αν τα κλειδιά είναι αριθμητικά μπορούμε να κάνουμε ταξινόμηση ως αριθμός (μπορούν να είναι ανάμεικτα, και ουσιαστικά εσωτερικά είναι αλφαριθμητικά, αλλά στην ταξινόμηση ως αριθμός γίνεται η ταξινόμηση αριθμητικά). Το θέμα εδώ είναι το πώς γίνεται η ταξινόμηση όταν έχουμε κείμενο (αλφαριθμητικό) στα κλειδιά. Μπορούμε λοιπόν να χρησιμοποιούμε το Τοπικό για να δηλώσουμε τον τρόπο ταξινόμησης.
Στα έγγραφα η ταξινόμηση παίρνει δυο ή τρεις παραμέτρους, τις παραγράφους αρχή και τέλος όπου εκεί θα γίνει η ταξινόμηση, και μια θέση χαρακτήρα σε κάθε παράγραφο απ΄όπου θα ξεκινάει η σύγκριση (δηλαδή κρατάμε αν θέλουμε πριν το κλειδί έναν αριθμό χαρακτήρων ως δεδομένα). Εξ ορισμού όπως και στις Καταστάσεις ο τρόπος σύγκρισης είναι η σύγκριση βάσει κειμένου (TextCompare). Στα έγγραφα μπορούν να υπάρχουν όμοια κλειδιά (η ειδική quicksort τα αντιμετωπίζει πολύ γρήγορα). Μπορούμε να επιλέξουμε τέσσερις διαφορετικές συγκρίσεις, που δίνονται στο αντικείμενο έγγραφο με την εντολή Μέθοδος. SetTextCompare (εξ ορισμούτ), SetBinaryCompare, SetDatabaseCompare και προστέθηκε η ΣετLocaleCompare όπου παίρνει προαιρετικά παράμετρο τον αριθμό τοπικού, ή αλλιώς χρησιμοποιεί το καταχωρημένο (αυτό που ίσως δώσαμε κατά τη φόρτωση από αρχείο για να γίνει μετατροπή σε unicode)


Έγγραφο α$={péché
            sin
            peach
            pêche
            }
Τύπωσε "Με 1036 Γαλλικά"
Μέθοδος α$, "SetLocaleCompare", 1036
Ταξινόμηση Αύξουσα α$, 1,4
Αναφορά α$
Τύπωσε "Με 1033 Αγγλικά"
Μέθοδος α$, "SetLocaleCompare", 1033
Ταξινόμηση Αύξουσα α$, 1,4
Αναφορά α$

Κατάσταση α="sin","pêche","péché","peach"
Ταξινόμηση α ως κείμενο, 1
Τύπωσε α, "κανονική αύξουσα"
Ταξινόμηση α ως κείμενο, 0
Τύπωσε α, "κανονική φθίνουσα"
Ταξινόμηση αύξουσα α ως κείμενο, 1036
Τύπωσε α, 1036
Ταξινόμηση αύξουσα α ως κείμενο, 1033
Τύπωσε α, 1033

και στα αγγλικά:


Document a$={péché
            sin
            peach
            pêche
            }

Method a$, "SetLocaleCompare", 1036
Sort ascending a$, 1,4
Report a$
Method a$, "SetLocaleCompare", 1033
Sort ascending a$, 1,4
Report a$


Inventory a="sin","pêche","péché","peach"
sort a as text, 1
Print a, "standard ascending"
sort a as text, 0
Print a, "standard descending"
sort ascending a as text, 1036
Print a, 1036
sort ascending a as text, 1033
Print a, 1033


3) Η εμφάνιση πραγματικών γίνεται πια με οποιοδήποτε τρόπο με την Τύπωσε με το 0 μπροστά από το σημείο δεκαδικών δηλαδή το Τύπωσε .10 θα δώσει το 0.10 ή το 0,10 ανάλογα ποιος είναι ο χαρακτήρας της υποδιαστολής. Υπάρχει ακόμα τρόπος, όπου μετατρέπεται ο αριθμός σε αλφαριθμητικό και με αυτό τον τρόπο δεν εμφανίζεται ο 0 πριν την υποδιαστολή (όταν δεν έχουμε δηλαδή ακέραιο μέρος).
4) Η χρήση του Locale ή Τοπικό έχει σημασία πια για τον χαρακτήρα της υποδιαστολής:
Ισχύουν ότι ίσχυε και πριν αλλά όταν χρησιμοποιήσουμε πχ το Τοπικό 1032 (ελληνικά) θα έχουμε το κόμμα ως υποδιαστολή. Μπορούμε να αλλάζουμε το Τοπικό όποτε θέλουμε. Μπορούμε να διαβάσουμε ποιο είναι με την μεταβλητή μόνο για ανάγνωση Τοπικό.

Για τα (3) και (4) υπάρχει αυτό το πρόγραμμα για να γίνει κατανοητός ο τρόπος (μπορούμε να ελέγχουμε την κατάσταση με την εντολή Monitor όπου δείχνει στοιχεία του περιβάλλοντος και τη θέση των διακοπτών). Η θέσε Διακόπτες μπορεί να αλλάξει πολλούς διακόπτες μαζί και γίνεται μόνο για την τρέχουσα εκτέλεση. Αν δώσουμε την εντολή στην κονσόλα τότε οι αλλαγές καταγράφονται για κάθε επόμενη φορά, ή ακόμα και όταν κάνουμε Break με το πλήκτρο ή γράψουμε Αρχή (break με εντολή):

Φόρμα 80, 50
Πίνακας Βάση 0, β$(2)
β$(0)="-DEC","+DEC"
' εδώ χρειάζεται γενική η αα για να την βάλουμε στη Θέσε
' επειδή η Θέσε γυρνάει πρόσκαιρα σαν να γράφουμε στη κονσόλα
' δηλαδή σαν να εκτελούμε από την γραμμή εντολών της Μ2000
Γενική αα=Κάθε(β$())
Ενώ αα {
      Για Άλλο=Αληθής Έως Ψευδής {
            ' η συνάρτηση Παράθεση$() βάζει στα αλφαριθμητικά εισαγωγικά
            Τύπωσε "Διακόπτες "+Παράθεση$(Πίνακας$(αα))
            Θέσε Διακόπτες Πίνακας$(αα)
            Κάνε φορμα1$()="{0:1:"+γραφή$(-στήλη)+"}{1:2:"+γραφή$(-στήλη)+"}"
            Αν Άλλο
Αλλιώς Τοπικό 1032 : Τύπωσε "Τοπικό ";Τοπικό
            Τύπωσε Μορφή$(φορμα1$(), -1.66, 2.45)
            Τύπωσε -1.66, 2.45
            Αν Άλλο Αλλιώς Τοπικό 1033 : Τύπωσε "Τοπικό ";Τοπικό
            Τύπωσε Μορφή$(φορμα1$(), -1.66, 2.45)
            Τύπωσε -1.66, 2.45
            Τύπωσε $(3), γραφή$(.66), γραφή$(-.45), $(0)," δεν αλλάζει ποτέ"
            Τύπωσε $(3), γραφή$(.66,0), γραφή$(-.45, 0), $(0)," δεν αλλάζει ποτέ"   ' $(3) σημαίνει στίχοιση δεξιά
            Τύπωσε $(3), γραφή$(.66,1033), γραφή$(-.45, 1033), $(0)," δεν αλλάζει ποτέ"   ' χρήση άμεσα τοπικού
            Τύπωσε $(3), γραφή$( .66,"") , γραφή$(-.45,"")
            ' $(0) είναι ο εξ ορισμού τρόπος στοίχισης σε στήλες, όπου οι αριθμοί στοιχίζονται δεξιά, και τα αλφαριθμητικά στοιχίζονται δεξία και μπορούν να καλύψουν αν χρειαστεί και άλλες στήλες.
            Τύπωσε $(0),.66, -.45
      }
}


και στα αγγλικά:
Form 80, 50
Dim Base 0, b$(2)
b$(0)="-DEC","+DEC"
' need global because Set run at global space
global aa=each(b$())
while aa {
      for skip=false to true {
            Print "Switches "+quote$(array$(aa))
            set switches array$(aa)
            def fom1$()="{0:1:"+str$(-tab)+"}{1:2:"+str$(-tab)+"}"
            if skip else locale 1032 : Print "locale ";locale
            print format$(fom1$(), -1.66, 2.45)
            print -1.66, 2.45
            if skip else locale 1033 : Print "locale ";locale
            print format$(fom1$(), -1.66, 2.45)
            print -1.66, 2.45
            print $(3), str$(.66), str$(-.45), $(0)," never changed"  ' no 0 and always . for decimal point, space infront for positive number
            print $(3), str$(.66,0), str$(-.45, 0), $(0)," never changed"   ' $(3) means right justification on this column and after
            print $(3), str$(.66,1033), str$(-.45, 1033), $(0)," never changed"   ' using locale direct
            print $(3), str$( .66,"") , str$(-.45,"")
            ' $(0) is the default justification, strings may use other columns and have left justification
            ' numbers have right justification
            print $(0),.66, -.45
      }
}


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

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

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