nikolakisgr Δημοσ. 6 Μαΐου 2008 Δημοσ. 6 Μαΐου 2008 Καλησπέρα, Τον τελευταίο καιρό έχω διαβάσει αρκετά άρθρα που αναφέρουν ότι σε windows applications θα πρέπει να γίνετε χρήση Unicode και όχι Latin-1 (ASCII). Για παράδειγμα αντί για "my string" θα πρέπει να δηλώνουμε L"my string" ή _T("my string") (το οποίο ουσιαστικά είναι macro που κάνει evaluate σε L##string εάν είναι defined το UNICODE) όπως επίσης και για χαρακτήρες (πχ. L'\0' κτλ). Επίσης αναφέρουν ότι αντί για char * θα πρέπει να γίνετε χρήση LPTSTR και LPCTSTR και γενικά να γίνετε χρήση generic characters. Αυτό που δεν μπορώ να καταλάβω είναι σε ποιες περιπτώσεις θα πρέπει να χρησιμοποιώ UNICODE (με όλες τις τροποποιήσεις που αναφέρω παραπάνω) και σε ποιες ASCII. Για παράδειγμα σε ένα πρόγραμμα χρησιμοποιώ τον παρακάτω κώδικα για να πάρω το full path ενός εκτελέσιμου αρχείου: char appPath[MAX_PATH]; GetModuleFileName(NULL, appPath, MAX_PATH); char *appDir = strrchr(appPath, '\\'); . . . μήπως θα πρέπει ο κώδικας να γίνει ως εξής ? TCHAR appPath[MAX_PATH]; GetModuleFileName(NULL, appPath, sizeof(appPath)); LPTSTR appDir = strrchr(appPath, '\\'); . . . Μήπως εάν υπάρχουν ελληνικοί χαρακτήρες στο directory από το οποίο τρέχει το εκτελέσιμο έχει σημασία αν θα χρησιμοποιήσω Unicode ή ASCII ? 2 τελευταίες ερωτήσεις: Μπορώ να χρησιμοποιήσω κανονικά τους pointers με generic characters? πχ. *appDir = _T('\0'); Εάν γίνει χρήση generic characters ποιες είναι οι αντίστοιχες functions της ANSI C (strlen, printf, scanf, strcpy κτλ) ? Υπάρχει κάποιος πίνακας στο msdn της Microsoft? (Δεν βρήκα κάτι) Ευχαριστώ για τον χρόνο σας.
Directx Δημοσ. 6 Μαΐου 2008 Δημοσ. 6 Μαΐου 2008 Μήπως εάν υπάρχουν ελληνικοί χαρακτήρες στο directory από το οποίο τρέχει το εκτελέσιμο έχει σημασία αν θα χρησιμοποιήσω Unicode ή ASCII ? Το ερώτημα σου είναι πολύ σωστό, διότι το File System των Windows είναι πλήρως συμβατό και χρησιμοποιεί εξ ορισμού κωδικοποίηση Unicode στην ονομασία των αρχείων, συνεπώς αν το λογισμικό σου βασίζεται μόνο σε ANSI και ο χρήστης έχει χρησιμοποιήσεις κάποιους Unicode χαρακτήρες που δεν είναι δυνατόν να μετατραπούν σε ανάλογους του ANSI τότε δυστυχώς το πρόγραμμα θα αποτύχει, όπως παρατηρεί και ο Raymond Chen, προγραμματιστής της Microsoft στο βιβλίο του “The new old thing” σελίδα 391. Τώρα σχετικά με τα Ελληνικά, αν το όνομα κάποιου αρχείου ή folder περιλαμβάνει Unicode χαρακτήρες που δεν έχουν άμεσο mapping (αντιστοιχία) σε ANSI θα αποτύχει. Ευτυχώς όμως αυτό δεν αφορά τα Νέα Ελληνικά, που κωδικοποιούνται άλλωστε πλήρως στην ANSI CodePage των Windows (CP. 1253) –- Αντίθετα με την χρήση Πολυτονικών Ελληνικών που κωδικοποιούνται πλήρως μόνο σε Unicode δίχως αναλογία αρκετών ειδικών χαρακτήρων (πχ. πνεύματα) σε ANSI, οπότε εκεί καλό είναι να προτιμάς ρουτίνες Unicode για την σωστή διαχείριση τους, διαφορετικά θα υπάρξουν (συνήθως) προβλήματα αφού οι Πολυτονικοί χαρακτήρες που δεν υπάρχουν φυσικά στην μονοτονική ANSI κωδικοσελίδα (1253) θα αντικατασταθούν αυτόματα από τα Windows με ένα αγγλικό ερωτηματικό '?' καθιστώντας την διαχείριση του path αδύνατη από το ANSI πρόγραμμα. Μπορώ να χρησιμοποιήσω κανονικά τους pointers με generic characters? πχ. *appDir = _T('\0'); Εάν γίνει χρήση generic characters ποιες είναι οι αντίστοιχες functions της ANSI C (strlen, printf, scanf, strcpy κτλ) ? Υπάρχει κάποιος πίνακας στο msdn της Microsoft? (Δεν βρήκα κάτι) Από εκεί και πέρα, αν πρέπει να διαχειριστείς άμεσα το buffer αυτό, φυσικά θα πρέπει να λάβεις υπόψη σου, με βάση το τι θες να είναι το πρόγραμμα σου (ANSI ή Unicode) την εσωτερική μορφή που θα έχει ο buffer σου (ένας ANSI χαρακτήρας = 1 Byte, ένας Unicode μπορεί να αποτελείται από περισσότερους). Για τις ρουτίνες C από ANSI σε Unicode για την Microsoft C++ δες εδώ, προς τέλος: http://www.i18nguy.com/unicode/c-unicode.html Υ.Γ. 1. Γενικά αν η εφαρμογή σου στοχεύει σε ένα πραγματικά διεθνές κοινό (Ασία, Μέση Ανατολή ή σε νοιάζει support σε εξωτικά code-pages όπως το Πολυτονικό κτλ.) και δεδομένης της εργασίας που επιτελεί (πχ. χρειάζεται να διαχειρίζεται επισταμένως filenames, folders κτλ), καλό είναι να γραφθεί ως Unicode -αν όχι, τότε μπορείς να αρκεσθείς σε ANSI ή σε DBCS(Double Byte Code System) -μια μορφή κωδικοποίησης χαρακτήρων με 2 bytes ανά χαρακτήρα, για γλώσσες τις Ασίας -προ Unicode εποχής (σήμερα όλοι γυρίζουν σε Unicode πια που καλύπτει όλες τις γλώσσες του κόσμου μια και έξω). 2. Για περισσότερες πληροφορίες σε τέτοιες ερωτήσεις δες το 16 κεφάλαιο από το "The old new Thing" του Raymond Chen, με τίτλο "International Programming".
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.