xmmm.. ellhnika

P. Christeas p_christ at hol.gr
Mon Jul 22 14:28:01 EEST 2002


Στις Παρ 19 Ιουλ 2002 11:15, ο/η John Salatas έγραψε:

> > Έχω συγκεντρώσει αρκετά bugs  σε αυτόν τον τομέα. Δοκίμασα iso8859-7
> > ονόματα,
> > αλλά και utf-8. Υπάρχει ένα κλασσικό προγραμματιστικό λάθος που κάνουν σε
> > αρκετά apps, αλλά και ένα μικρό προβληματάκι στην qt 2.x που δυσκολεύει
> > τα πράγματα. Αν θές, θα σου πώ λεπτομέρειες.
>
> Kalo tha itan an mou eleges ti exeis brei. Isws tha mporousame na kanoume
> kati gia na lythei auto to provlima, an bebaia thes na asxolitheis kai esi
> ('h kapoios allos).
> Thanks

Επιφυλάσσομαι για τα συμπεράσματα, γιατί δεν έχω δεί το Qt 3.x ακόμα.
Στην Qt 2.x υπάρχει η περίφημη τάξη QString. Αυτή δουλεύει με utf-8 
εσωτερικά. Υπάρχει το κλασικό char* (το 8-μπιτο) και η QChar, η οποία 
βασίζεται στο char*. Λίστες είναι η QStringList (που 'κρατάει' QString) και η 
QStrList (που κρατάει QChar's).
Οι περισσότερες διαδικασίες για αρχεία του συστήματος επιστρέφουν ή δέχονται 
char*, δηλαδή 8-μπιτα.
Για να μετατρέψουμε ένα char* σε QString υπάρχουν 3 διαδικασίες:
1. QString QString::fromLatin1(const char*)
2. QString QString::fromLocal8Bit(const char*)
3. QString QString::fromUtf8(const char*)
(σημ. δεν θυμάμαι ακριβώς αυτά τα ονόματα, μπορεί να διαφέρουν λίγο)
Η νο.1 εκτελείται και στον operator =(const char*). Αυτήν κατά λάθος 
χρησιμοποιούν οι προγραμματιστές. Αυτή νομίζει οτι τα char* είναι σε iso8859-1
Εμείς θέλουμε την νο.2. Αυτή διαβάζει το locale και καταλαβαίνει το iso8859-7.
Το πρόβλημα είναι όταν έχουμε και utf-8 γιατί η νο.2 στο Qt.2.x δεν δεχόταν 
locale με utf-8. Θα έπρεπε να καταλαβαίνει για τα utf-8 locales οτι το char* 
είναι τέτοιο και να συμπεριφέρεται σαν την νο.3.
Αρα:
 - όπου υπάρχει char* και θέλουμε να το κάνουμε QString, γράφουμε:
	strvar= QString::fromLocal8bit(charvar);
 - όπου υπάρχει QString και θέλουμε να το κάνουμε char*, γράφουμε:
	charvar= strvar.local8bit();
 - δεν χρησιμοποιούμε τον operator = () στις παραπάνω περιπτώσεις, αλλά τις 
παραπάνω διαδικασίες.
 - αντικαθιστούμε κάθε εμφάνιση του fromLatin1 με fromLocal8bit και του 
toLatin1 με toLocal8bit με αρκετή ασφάλεια.
 - όπου υπάρχουν ονόματα αρχείων, τα κρατάμε σε QString's, χωρίς μετατροπές 
σε char* όσο γίνεται. Οι διαδικασίες των QFile κλπ δουλεύουν καλά με QString's
 - όπου υπάρχουν λίστες με ονόματα αρχείων, χρησιμοποιούμε QStringLists και 
όχι QStrList.
 - στα αρχεία ρυθμίσεων αποθηκεύουμε τα QString's και διαβάζουμε αντίστοιχα 
QString's ( και όχι char*). Η Qt θα χρησιμοποιήσει αυτόματα και σωστά το 
utf-8 για τους ελληνικούς χαρακτήρες. 
 - όπου καλείται ξένο πρόγραμμα (με την KProcess), δίνουμε QString στα 
arguments και μεταφράζουμε την stdin/stderr του προγράμματος με το 
fromLocal8bit.

Ελπίζω να ήμουν κατατοπιστικός. Περιμένω σχόλια και διορθώσεις για το Qt 3.x
Σε όποιο πρόγραμμα δεν δουλεύει σωστά, κοιτάχτε αν εφαρμόζονται οι παραπάνω 
κανόνες.

Σημ: δυσκολεύτηκα αρκετά να στείλω κάποια patches που είχα φτιάξει για το 
Cervisia και το KDevelop. Αυτά έχουν παλιώσει πλέον και δεν είναι Bugs αλλά 
ζήτημα σωστού προγραμματισμού. 



More information about the Linux-greek-users mailing list