Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Το πρόβλημα είναι: 1) Με την printf αν εμφανίσω ελληνικά δεν τυπώνονται σωστά αλλά, μπορώ να  εισάγω ελληνικές λέξεις στο αρχείο και όταν πάω να τις διαβάσω τις εμφανίζει σωστά.

2) αν ανοίξω το αρχείο κειμένου(το αρχείο δλδ που περιέχει τις λέξεις) δεν τις εμφανίζει σωστά.

Επίσης να αναφέρω τα εξής : α) αν ανοίξω το αρχείο με τον κώδικα( το .c δηλαδή) με το notepad++ ,  στην κωδικοποίηση αναφέρει UTF-8. β) αν ανοίξω το αρχείο κειμένου με notepad++ σαν κωδικοποίηση αναφέρει ISO 8858-7. γ) στην πρώτη γραμμή του κώδικα έχω : system("chcp 1253"). αν το βγάλω δεν εμφανίζει σωστά τα ελληνικά. δ) στο code blocks χρησιμοποιώ UTF-8 κωδικοποίηση.

  • Απαντ. 100
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Δημοσ.

Φίλε κυρηλέ, χωρίς απολύτως καμία πρόθεση να σε προσβάλλω, με παπαγαλία δεν πρόκειται να κάνεις δουλειά. Νομίζω πως σου έχω δώσει αρκετά hints και για να καταλάβεις πάνω-κάτω τι παίζει, αλλά και για να το ψάξεις περισσότερο.

 

The best bet για να έχεις όσο το δυνατόν λιγότερα προβλήματα, είναι να "μονιμοποιήσεις" στο registry τόσο την OEMCP όσο και την ACP σε μια ANSI κωδικοσελίδα (την ίδια και στα 2) που για τα ελληνικά είναι η 1253 (έχω δείξει ήδη πως μπορείς να το κάνεις αυτό, αλλά έχω επισημάνει επίσης ότι ενέχει το ρίσκο να κάνεις corrupt το registry αν δεν είσαι εξοικειωμένος).

 

Από εκεί και πέρα, εγώ δεν γνωρίζω ούτε 747 κωδικοσελίδα, ούτε 8858-7 (γνωρίζω όμως τις OEM 737 και ISO 8859-7). Αν διάβασες το τελευταίο link που έδωσα, θα είδες ήδη πως άλλη κωδικοσελίδα χρησιμοποιεί η κονσόλα, κι άλλη τα GUI.

 

Ένα επιπλέον πρόβλημα είναι πως το Code:Blocks δεν δείχνει να έχει explicit support για ANSI/OEM code-pages, παρά μόνο μέσω της επιλογής "System Default", που κι αυτή από ότι φαίνεται άμα περιέχει ελληνικούς χαρακτήρες το πηγαίο αρχείο, σου τα γυρίζει θες δεν θες σε UTF-8. Από την άλλη μεριά, υπάρχουν θέματα στην μετατροπή του iconv από UTF8 σε OEM codepages (ενώ σε ANSI codepages είναι πιο αποτελεσματικό).

 

Όπως και να 'χει, ο παρακάτω κώδικας γραμμένος σε notepad++ με κωδικοποίηση πηγαίου ANSI (Windows 1253) και compiled απευθείας στην γραμμή εντολών με mingw-gcc και flags -finput-charset=cp1253 -fexec-charset=cp1253, καθώς και με system( "chcp 1253" ); στην αρχή της main() (βασικά σε μένα που έχω πειραγμένο το registry δεν χρειάζεται καν) δουλεύει aw epxected, τόσο σε standard i/o όσο και σε file i/o. Τον δοκίμασα μόλις σε Win XP (δεν μπορώ να εγγυηθώ όμως πως θα δουλεύει και σε Win 8/8.1)

 

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>

#define GR_ALPHABET  "αάβγδεέζηήθιίϊΐκλμνξοόπρστυύϋΰφχψωώΑΒΦΔΕΈΖΗΉΘΙΊΚΛΜΝΞΟΌΠΡΣΤΥΎΦΧΨΩΏ"
#define MAXWORD     (15+1)

int main( void )
{
	char input[BUFSIZ] = {'\0'};
	char word[MAXWORD] = {'\0'};
	size_t wlen = 0, ablen = strlen(GR_ALPHABET);
	size_t i = 0, n = 0;
	char *cp = NULL;
	FILE *fp = NULL;

	system( "chcp 1253" );

	printf( "Πώς σε λένε; " );
	fflush( stdout );
	fgets( input, BUFSIZ, stdin );
	if ( NULL != (cp=strchr(input,'\n')) ) {
		*cp = '\0';
	}

	printf( "*** Μισό λεπτό %s ***\n\n", input );

	fp = fopen( "kyrhles.txt", "w" );
	if ( NULL == fp ) {
		fputs( "*** error: write-file failed! Bye...\n", stderr );
		goto exit_failure;
	}

	fprintf( fp, "*** από %s ***\n", input );

	srand( time(NULL) );

	for (n=0; n < 10; n++) {
		/* make a c-string, consisting of up to MAXWORD random
		greek letters, with length no less than 3 characters */
		wlen = rand() % MAXWORD;
		if ( wlen < 3 ) {
			wlen = 3;
		}
		for (i=0; i < wlen; i++) {
			word[i] = GR_ALPHABET[ rand() % ablen ];
		}
		word[i] = '\0';

		printf( "%s\n", word );
		fprintf( fp, "%s\n", word );
	}

	fclose( fp );
	system( "pause" );
	exit(0);

exit_failure:
	system( "pause" );
	exit(1);
}
Το τελευταίο link που σου έδωσα, εξηγεί όμορφα και περιεκτικά ποιο είναι το πρόβλημα.
Δημοσ.

μισό λεπτό ρε φίλε, πρώτον το 747 και δεύτερον το 8859-7 είναι λάθος, παράλειψή μου. Είναι προφανώς 737 και ISO 8859-7 :P

Interesting code btw:P


Άμα σου πω ότι για flag έβαζα -fexec-charset=cp747 και τώρα που το άλλαξα είμαι μια χαρά... Θα ακουστεί περίεργο ΑΛΛΑ οχι δεν καπνίζω χόρτο :lol: 


Όποιος δεν θέλει να πειράξει το registry ας δει εδώ έχει μια εναλλακτική λύση: http://superuser.com/questions/387569/how-do-i-permantly-set-the-command-prompt-codepage-in-windows-7. Αν κατάλαβα καλά , αλλάζει την κωδικοσελίδα κάθε φορά που ανοίγει ένα command prompt. Εμένα μου δούλεψε και αυτό..

  • 1 χρόνο αργότερα...
Δημοσ. (επεξεργασμένο)

Καλησπερα, γνωριζω οτι εχει χιλιοειπωθει το θεμα, αλλα για C αποκλειστικα, ποιον IDE θα λεγατε που να μπορει να τρεξει με gcc compiler?

 

Στα παλαιοτερα ετη στην σχολη μου ειχα δουλεψει με DevC++, Eclipse, CodeBlocks, Visual Studio οποτε τωρα θελω να καταληξω σε ενα.

 

Θα μου αρεσε να περιεχει features οπως του CodeBlocks ή του Eclipse (για java το χρησιμοποιησα το εν λογω) αλλα το πιο σημαντικο για μενα ειναι να ειναι stable και να ειναι κομπλε με C και τον gcc διοτι μου ειχε συμβει παλαιοτερα να μην μου τρεχει ενα προγραμμα και να μου βγαζει bug σε συγκεκριμενο IDE και να ψαχνω τι μπορει να εχω κανει λαθος και μετα να ανακαλυπτω στο google οτι ειναι θεμα του IDE με την C.

 

Τρεχω windows 7 64bit.

Επεξ/σία από pavlos1908
Δημοσ.

Για το θέμα των ελληνικών στη C μήπως να έβαζε κανείς ελληνικά στην υποστήριξη των μη Unicode προγράμματων;

Δημοσ.

Εαν καποιον ενδιαφερει αλλαγη απο 437 (737) σε 928 (η αλλιως 8859-7) ειχα φτιαξει πολυ παλια μια μετατροπη

Ουτε και θυμαμαι ποτε το εκανα, αλλα ο πινακας ειναι ο εξης:

 

char conv_table[]=
{0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,
0xD0,0xD1,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,
0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF3,0xF2,0xF4,0xF5,
0xF6,0xF7,0xF8,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,0xF9,0xDC,0xDD,0xDE,0xFA,
0xDF,0xFC,0xFD,0xFB,0xFE,0xB6,0xB8,0xB9,0xBA,0xBC,0xBE,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,0xFE,255};

 

 

Η εισοδος πρεπει να ειναι σε 437, τυπου unsigned char[]

 

void transstr(unsigned char *q)
{
while(*q) {
     if(*q>127) *q=conv_table[(*q)-128];
     q++;
    }
}

 

Αν ενδιαφερεται καποιος του στελνω τον κωδικα για ενα μικρο προγραμματακι σε command line, η αλλιως το exe

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα

  • Δημιουργία νέου...