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

Dev-c++ problem


Giourkas1

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

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

Απλά έχε το console σε μορφή παραθύρου (όχι full screen) και γύρισε το φόντο του σε Lucida Console (δες τα properties του console), ύστερα δώσε την εντολή chcp 1253 και θα πρέπει να είσαι ok.

 

mjzimtgnjnngllzmdnml.png

 

Τα παιδιά σε εκείνο το παλιό θέμα (http://www.insomnia.gr/vb3/showthread.php?p=1014029#post1014029) με αυτή την συνταγή βρήκαν λύση στο ίδιο πρόβλημα - γιατί όχι και εσύ ... ;)

Δημοσ.

μικρη λεπτομερεια....χρησιμοποιω full-screen.... ;) (ειδα το θεμα,θα προσπαθησω αργοτερα να δω τι γινεται με fullscreen)

 

οταν λες γυρισε το φοντο του σε Lucida Console,εννοεις?

Δημοσ.

Η συνταγή με το chcp δουλεύει, το κακό είναι ότι θα δουλεύει μόνο στον δικό σου Η/Υ και αφού κάνεις τις απαραίτητες ρυθμίσεις! :)

 

Εφόσον γράφεις πρόγραμμα για κονσόλα, το σωστό είναι να γράφεις σε κωδικοσελίδα OEM (cp737).

 

Το Visual Studio δεν είναι δύσκολο. Απλά εγκατέστησε την Express Edition που είναι τζάμπα και κάνε new console project.

Ή βάλε το Code::Blocks, και τα δύο υποστηρίζουν OEM charset.

 

Αν κάποια στιγμή βρω χρόνο θα κοιτάξω και το manual του gcc (τον οποίον χρησιμοποιούν και το devcpp και το codeblocks) για να δω αν υποστηρίζει charset transcoding, δηλαδή να γράφεις 1253 και να παράγει 737, οπότε να λυθεί σωστά το πρόβλημα είτε δουλεύεις με devcpp είτε με codeblocks...

Δημοσ.

Υπάρχει και ένας ακόμα τρόπος που μόλις βρήκα, λοιπόν μπορούμε να ζητήσουμε από τα MS-Windows να μετατρέψουν αυτόματα τους χαρακτήρες ενός string μας στην κωδικο-σελίδα του MS-DOS (OEM) που στην περίπτωση μας είναι η Ελληνική -γλιτώνουμε το Conversion (αρκεί βέβαια ο Compiler να έχει headers & libraries που υποστηρίζουν το WinAPI).

 

Αυτό το πετυχαίνουμε εύκολα με την ρουτίνα CharToOem και CharToOemBuff τις οποίες μπορούμε να καλέσουμε με κοινή παράμετρο αρκεί τα δυο String που μετατρέπουμε να είναι ANSI (όχι MBCS δηλαδή κτλ.)

 

Ακολουθεί παράδειγμα γραμμένο σε CodeGear C/C++ Builder 6 δοκιμασμένο σε MS-Windows XP Home.

 

Το μετατρεπόμενο κείμενο φυσικά παρουσιάζεται σωστά σε κάθε περίπτωση, είτε δηλαδή σε Console Window είτε σε Full-Screen Console.

 

>
//-CharToOem-----------------------------------------------------------------
#include <stdio.h>
#include <windows.h>

#ifdef __BORLANDC__
  #pragma hdrstop
#endif

//---------------------------------------------------------------------------

#ifdef __BORLANDC__
  #pragma argsused
#endif
int main(int argc, char* argv[])
{
  char *pszTest = "Ελλάς!!",
       *pszEnd  = "Πατήστε Enter για τέλος..";

  printf(" Windows Greek under Console: \"%s\"\n",pszTest);

  if(CharToOem(pszTest,pszTest))
   printf(" Windows Greek under Console after CharToOem: \"%s\"\n",pszTest);
  else
   printf(" CharToOem failure!\n");

  if(CharToOem(pszEnd,pszEnd))
   printf("%s\n",pszEnd);
  else
   printf(" Press Enter to quit...");

  getchar();
  return 0;
}
//---------------------------------------------------------------------------

 

Υ.Γ.

Φυσικά τα MS-Windows παρέχουν και αντίστροφες ρουτίνες όπως την OemToChar και OemToCharBuff κτλ..

 

Ελπίζω αυτό να βοηθήσει :)

Δημοσ.

Το WinAPI έχει και τις παρακάτω:

 

SetConsoleOutputCP (http://msdn2.microsoft.com/en-us/library/ms686036.aspx):

Την καλείς μια φορά (σε αντιστοιχία με την chcp 1253) και ξεμπέρδεψες, δεν χρειάζεται να την καλείς για κάθε string. Γράφει για .net framework 3, αλλά ισχύει γενικά για Windows >= NT, δεν χρειάζεται framework.

 

SetConsoleCP: το ίδιο αλλά για input.

 

WideCharToMultiByte και MultiByteToWideChar: για μετατροπές από/σε OEM/ANSI/Unicode/UTF8/κτλ

 

SetFileApisToANSI: για να μπορείτε να ανοίγετε αρχεία με ελληνικά ονόματα ή ελληνικό περιεχόμενο όταν χρησιμοποιείτε Windows 1253.

 

Κτλ κτλ. Συμπέρασμα: αν γράφετε κώδικα που τρέχει σε κονσόλα, χρησιμοποιήστε εξ' αρχής cp737!!! Βρείτε ένα IDE που να προσφέρει αυτήν την δυνατότητα!!!

Δημοσ.

Δυστυχώς το SetConsoleOutputCP δεν τα καταφέρνει στο δικό μου μηχάνημα εκτός και αν κάνουμε το trick με τα fonts (1253) διαφορετικά τζίφος (ούτε full screen επίσης :() ... οπότε CharToOem.

 

>
//---------------------------------------------------------------------------
#include <stdio.h>
#include <windows.h>
#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused
int main(int argc, char* argv[])
{
  int   nCodePage[] = { 1253, 737, 437 },
        nCodePageIdx;

  for(nCodePageIdx=0;nCodePageIdx<3;nCodePageIdx++)
   {
     printf(" %.4d = ",nCodePage[nCodePageIdx]);
     if(!SetConsoleOutputCP(nCodePage[nCodePageIdx]))
      printf(" Invalid code-page!\n");
     else
      printf(" Ελλάς!\n");

     printf(" Press Enter to Move on...");
     getchar();
   }

  printf("\n Press Enter to Quit...");
  getchar();

  return 0;
}
//---------------------------------------------------------------------------

Δημοσ.

> Δυστυχώς το SetConsoleOutputCP δεν τα καταφέρνει στο δικό μου μηχάνημα εκτός και αν κάνουμε το trick με τα fonts (1253) διαφορετικά τζίφος (ούτε full screen επίσης)

 

Ναι, αυτό είναι γνωστό πρόβλημα, έχει αναφερθεί στην msdn.

 

> οπότε CharToOem.

Όμως έτσι θα πρέπει να αλλαχθεί όλος ο κώδικας εκεί που υπάρχουν strings, είναι ασύμφορο. Και θέλει και την SetFileApisToANSI για τα αρχεία, γιατί αλλιώς δεν δουλεύουν σωστά όσα έχουν ελληνικό όνομα ή περιεχόμενα. Υπερβολικό overhead απλά για να διορθωθεί ένα πρόβλημα με codepages.

 

Στο visual studio (και σε άλλους IDE) του λες ότι θες να δουλεύεις με κωδικοσελίδα 437 και ξεμπερδεύεις με όλα χωρίς καμία απολύτως αλλαγή στον κώδικα και χωρίς χρήση WinAPI (οπότε αν θες μετά το κάνεις κατευθείαν compile και σε unix)...

 

Ο gcc έχει μια επιλογή -fexec-charset αλλά δεν την δοκίμασα ποτέ. Στην χειρότερη περίπτωση μπορεί να βάλει στο preprocessing stage του devcpp να εκτελεί ένα utility αλλαγής κωδικοσελίδας, υπάρχουν μπόλικα τέτοια. Αλλά δεν βλέπω το λόγο γιατί να μην αλλάξει απλά IDE.

Δημοσ.

Δεν λέω και εγώ μαζί σου, ας πάει σε άλλο IDE, απλά ορισμένες φορές είναι δύσκολο να αφήσεις κάτι που ξέρεις αρκετά καλά, ύστερα ορισμένοι compilers δεν υποστηρίζουν #pragma setlocale (πχ. C/C++ Builder 6 :() το δέον για εμένα λοιπόν θα ήταν να δούλευε σωστά η SetConsoleCP γενικότερα αλλά δυστυχώς αυτό δεν είναι εφικτό προς το παρόν.

 

Υ.Γ.

Αν θυμάμαι καλά στο Visual Studio το pragma για το codepage είναι κάτι σε #pragma setlocale ( ; )

Δημοσ.

Αν θυμάμαι καλά δε χρειάζεται pragma, έχει σχετική επιλογή στα solution options. Επίσης έχει και open with encoding οπότε δεν χρειάζεται καν τα options...

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

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