Αλλαγή γραμματοσειράς
Ημερομηνία Κυρ Απρ 20, 2014 12:51 am
foss.aueb.gr
Αρχική Κοινότητας Courses C / C++

C / C++

Ελληνικά στην C++

Προγραμματισμός σε C ή C++ - ερωτήσεις - απορίες - αλγόριθμοι - etc
Related Courses: Προγραμματισμός με C++, Λειτουργικά Συστήματα, Γραφικά, Δίκτυα Υπολογιστών

Ελληνικά στην C++

Δημοσίευσηαπό christose » Σάβ Μαρ 31, 2012 1:36 am

Παιδιά, καλησπερα, ηθελα να ρωτησω αν υπαρχει τροπος να διαβασω ελληνικα απο ενα αρχειο και να τα τυπωσω στο command line. μεχρι στιγμης τυπωνονται κινεζικα. το εχω ψαξει πολυ χωρις να εχω βρει λυση, κατι με codepages και setlocale αλλα τιποτα δεν γινεται.

ευχαριστω!
The Quieter you Become, the More you are Able to Hear
Άβαταρ μέλους
christose
Open Member
 
Δημοσ.: 1
Εγγραφη: Παρ Νοέμ 18, 2011 2:04 am
Operating System: Win7&Linux

Re: Ελληνικά στην C++

Δημοσίευσηαπό arpl » Κυρ Απρ 01, 2012 6:57 pm

Υποθέτω πως βρίσκεσαι σε λειτουργικό Windows* μιας και αναφέρεις code pages. Οπότε δοκίμασε chcp 869 σε ένα cmd και μετά το πρόγραμμά σου.
Περισσότερα για την εντολή chcp.
Άβαταρ μέλους
arpl
Open Member
 
Δημοσ.: 66
Εγγραφη: Πέμ Μάιος 07, 2009 5:34 pm
Τοποθεσια: /dev/null
Operating System: NONE

Re: Ελληνικά στην C++

Δημοσίευσηαπό c00kiemon5ter » Κυρ Απρ 01, 2012 11:45 pm

Πού'σαι ρε arpl! :ugeek:


Γενικά είναι ένα χάος το τί γίνεται εκτός ascii. :o
Επίσης, δε γνωρίζω τίποτα που να είναι portable (να παίζει και σε Linux/Unix/.. και σε Windows).

αν λοιπόν δε θες να αλλάξεις το chcp, σε Windows command line,
και θες να το κάνεις προγραμματιστικά, αυτά γνωρίζω:

Η ιστορία:
Αρχικά λοιπόν, είχαμε το ASCII character set. Κάποτε το byte ήταν 7 bit,
που σημαίνει ότι είχες (2^7) - 1 = 127, 127 χαρακτήρες στη διάθεσή σου.
Το ASCII charset δούλευε καλά, αλλά είχε μόνο αγγλικούς χαρακτήρες.
Μετά οι υπολογιστές είχαν 8bit/byte, κι άρα τώρα υπήρχε παραπάνω
χώρος, για να μπούν κι άλλοι χαρακτήρες (128..255).
Με τον νέο αυτό χώρο, ο καθένας άρχισε να προσθέτει χαρακτήρες τις
χώρας του (Ελληνικά, Ρώσσικα, Ινδικά .. ) και έτσι δημιουργήθηκε ένα
χάος, που έφερε την ανάγκη των "code pages".
Τώρα ο καθένας είχε το code page του, έτσι υπήρχε ένα code page
για Ελληνικά, ένα για Ινδικά, ένα για Ισλαμικά κλπ.
κι όλα, δούλευαν καλά, ..αν μίλαγες μόνο μία γλώσσα.
Δεν υπήρχε τρόπος να εμφανίσεις πχ Γερμανικά κ Γαλλικά στο
ίδιο πρόγραμμα, εκτός κι αν ο ίδιος "ζωγράφιζες" τα γράμματα.

Τότε ήρθε το unicode, το οποίο όπως λέει το όνομα του,
προσπάθησε να ενώσει τα διαφορετικά code pages.
Το unicode δεν αντιπροσωπεύει γράμματα αυτά καθευτά,
αλλά παρέχει κωδικοποιήσεις αυτών, "code points".
πχ U+0666. Θεωρητικά δεν υπάρχει όριο στον αριθμό
γραμμάτων που μπορεί να αναπαραστήσει το unicode.
Τα code points λοιπόν, είναι απλά κωδικοποιήσεις, δεν
αντιπροσωπεύουν άμεσα τα γράμματα που δείχνουν.
Αυτό το κάνουν τα encodings. Τα encodings ουσιαστικά
είναι ο τρόπος που αποθηκεύεις και "μεταφράσεις" τα
code points.

Για να μη γίνει ένα μεγαλύτερο χάος, το unicode περικλύει
το ASCII, και έτσι τα code points, U+0000 ... U+0127 αντιπροσωπεύουν
τους χαρακτήρες που αντιπροσωπεύει το ascii charset (compatibility).

Ένα από τα πιο γνωστά κ ευρέως χρησιμοποιούμενα encodings
είναι το UTF-8. Ένα άλλο γνωστό encoding είναι το UTF-16, το
οποίο χρησιμοποιεί 8bit + 8bit = 16bit για κάθε χαρακτήρα,
(το αντίστοιχο *δεν* ισχύει για το UTF-8, το UTF-8 έχει
μεταβλητό μήκος bit για κάθε χαρακτήρα που αποθηκεύει).

Ο κόσμος πλέον χρησιμοποιεί unicode, και κυρίως UTF-8 κ UTF-16 encodings.
Επιπλέον υπάρχουν κάποια encodings όπως cp1253 ή ISO8859-7, τα οποία
είναι "μειωμένα" και μπορούν να αναπαραστήσουν χαρακτήρες μόνο από τη
γλώσσα που αντιπροσωπεύουν (τα δύο παραπάνω Ελληνικά).

Τώρα, επειδή τα πράγματα γίνανε περισσότερα κ μεγαλύτερα, όλοι χαρακτήρες
δε χωράνε σε 1byte (ή 8bit). Ήδη είδαμε ότι το UTF-16 χρησιμοποιεί 2byte(ή 16bit)
για κάθε χαρακτήρα. Για τον λόγο αυτό, ενώ είχαμε char σε ascii charset, σήμερα
έχουμε w_char για unicode, aka wide characters ("wide" as in more than 8bit).

Θα μιλήσω για Window κ Linux (κι όχι για Unix γενικά, γιατί δε ξέρω τι γίνεται αλλού,
ξέρω ότι το plan9 έχει κάνει πολύ καλή δουλειά και όλα λειτουργούν σε utf8,
με μια πολύ όμορφη stdlib, αλλά ποίος νοιάζεται για το plan9 :cat:) .

Τα Windows χρησιμοποιούν πλέον UTF-16, ενώ το Linux γνωρίζει
το unicode και δουλεύει κυρίως με UTF-8 strings natively.
Στη C++ υπάρχει πλέον char (1byte), wchar_t (4byte σε Linux, 2byte σε Windows(UTF-16)),
std::string (που χρησιμοποιεί char) και std::wstring (που χρησιμοποιεί wchar_t).

tldr; Αυτό σημαίνει, ότι αν δουλεύεις σε Linux τότε δε
χρειάζεται να αλλάξεις κάτι από αυτά που ήξερες.

Κώδικας: Επιλογή όλων
#include <stdio.h>

int main(void) {
    char *str = "Γειά σου κόσμε!";
    puts(str);
    return 0;
}

θα δουλέψει όπως είναι (αν κ αυτό είναι C, έχω ξεχάσει C++) .

Αν δουλεύεις σε Windows τότε wchat_t και std::wstring is your friend.


αν είπα τίποτα λάθος, διορθώστε με. :?
Computers are simple. You just write an instruction and they follow it.
Εικόνα
a cookie! ~ i.will.do.science.to.it! Εικόνα
Άβαταρ μέλους
c00kiemon5ter
cookie hunter
 
Δημοσ.: 556
Εγγραφη: Δευτ Μάιος 11, 2009 1:55 am
Τοποθεσια: (void *)NULL
Operating System: ~ Arch ~ .: Gentoo :.


Επιστροφή στην C / C++

cron
foss.aueb.gr

Μελη σε συνδεση

Συνολικά υπάρχει 1 μέλος συνδεδεμένο: 0 εγγεγραμμένο, 0 κρυφοί και 1 επισκέπτης (με βάση τα μέλη που έχουν συνδεθεί τα τελευταία 5 λεπτά)
Περισσότερα μέλη σε σύνδεση 127 την Τρί Αύγ 27, 2013 9:41 pm

Μέλη σε αυτή την Δ. Συζήτηση : Δεν υπάρχουν εγγεγραμμένα μέλη και 1 επισκέπτης

Γενέθλια

Κανένα μέλος δεν έχει γενέθλια σήμερα