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

convert d=>δ


evagelos_21

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

Δημοσ.

παιδιά θέλω να κάνω μια ερώτηση.

θέλω να μετατρέψω μια σειρά απο χαρακτήρες απο αγγλικούς σε ελληνικούς.

πχ: vaggelis σε βαγγελης, rock σε ροκκ

 

μήπως έχει κανείς καμιά ιδέα;

Δημοσ.

Φτιαχνεις μια array με ολα τα γραμματα της Ελληνικης αλφαβητου , και μια της αγγλικης.

πχ : string *Eng[27];

string *Ell[24];

 

Τωρα ,αποθηκευσε το string κειμενου σε ενα buffer , και ξεκινα να διαβαζεις καθε χαρακτηρα (εναρξη γραμμης=-1 , τελος = μηκος χαρακηρων string).

και ξεκινα να αποθηκευεις καπως ετσι :

while ( (buff !=" ") | (buff!="") ) {

αναζητηση

εαν βρεθει χαρακτηρας τοτε,βρες τη θεση του στο string,

συγκρινε τον με την array και βρες ποιο χαρακτηρα πρεπει να αντικαταστησεις..

}

Δημοσ.
Φτιαχνεις μια array με ολα τα γραμματα της Ελληνικης αλφαβητου ' date=' και μια της αγγλικης.

πχ : string *Eng[27'];

string *Ell[24];

 

Τωρα ,αποθηκευσε το string κειμενου σε ενα buffer , και ξεκινα να διαβαζεις καθε χαρακτηρα (εναρξη γραμμης=-1 , τελος = μηκος χαρακηρων string).

και ξεκινα να αποθηκευεις καπως ετσι :

while ( (buff !=" ") | (buff!="") ) {

αναζητηση

εαν βρεθει χαρακτηρας τοτε,βρες τη θεση του στο string,

συγκρινε τον με την array και βρες ποιο χαρακτηρα πρεπει να αντικαταστησεις..

}

 

Καταρχήν η σύγκριση δυο string δεν γίνεται έτσι. Επειδή μάλλον μιλάμε για C.

Χρειάζεσαι κάποια function όπως η strcmp (string compare της string.h).

Επιπλέον το

>(buff!=" " | buff!="")

δεν είναι σωστό διότι για να μπει στην while θα πρέπει τουλάχιστον μια από τις δυο περιπτώσεις να μην ισχύει. Δηλαδή μπορεί το buff να είναι "" αλλά όχι " " οπότε η δεύτερη συνθήκη είναι true και (false or true) = true και εκτελείται ο κώδικας του loop.

Δημοσ.
Πιστεύω ότι μπορείς να πας στο word και με το replace (Ctrl + H) μπορείς να αλλάξεις όλα τα γράμματα κάνοντας το 26 φορές!! ....

Κάτι τέτοιο όμως θεωρείται προγραμματισμός;

Δημοσ.

Καταρχήν όλα στηρίζονται στον πίνακα ASCII (αν δεν ξέρεις τι είναι, google it). Από εκεί και μέτα το ελληνικό κεφαλαίο γράμμα Άλφα έχει τον κωδικό αριθμό (στο δεκαδικό) 193 και το αντίστοιχο αγγλικό κεφαλαίο γράμμα έχει το 65. Επίσης το ελληνικό κεφαλαίο Βήτα έχει το 194 και το αντίστοιχο αγγλικό το 66. Κλπ κλπ.

 

Όπως βλέπεις κάθε ελληνικό γράμμα απέχει από το αντίστοιχο αγγλικό του ακριβώς 128. Οπότε π.χ. για να πάρεις το C, κάνεις 'Γ'-128. Έτσι ο κώδικάς σου θα είναι 5 γραμμές! Μπορώ να σου το δώσω ακριβώς άμα θες.

Βέβαια μπορεί κάποιος να προτιμάει μια διαφορετική αντιστοίχιση όπως το ελληνικό 'Β' να μεταφράζεται ως 'V'. Τότε θα ακολουθήσεις μια διαφορετική προσέγγιση. Αυτή καλύπτει και τους φθόγγους μπ, ντ, τζ, κλπ.

 

Θα χρειαστείς, όπως σου είπαν και οι υπόλοιποι, έναν πίνακα με όλες τις αντιστοιχίσεις (οι οποίες είναι περισσότερες από 24 αν συμπεριλάβεις και τους φθόγγους). Εγώ όμως σου προτείνω να μην τον φτιάξεις μέσα στον κώδικα του προγράμματος αλλά σε ένα εξωτερικό αρχείο txt και να τον διαβάζεις κάθε φορά στην αρχή του προγράμματος. Έτσι με τον ίδιο ακριβώς κώδικα και αλλάζοντας το εξωτερικό αρχείο txt, το πρόγραμμά σου θα μπορεί να μετατρέπει ό,τι θες και σε κάτι άλλο (π.χ. english σε l33t ή κάποιο αλφάβητο σε αριθμούς σαν κάποιο είδος κρυπτογράφησης).

Δημοσ.
Κάτι τέτοιο όμως θεωρείται προγραμματισμός;

 

μάλλον όχι, πιο πολύ μπακαλισμός:mrgreen: απλά σε αυτό που ειπόθηκε πιο πάνω με το word απάντησα:oops:

Δημοσ.

Αν είναι σε Java μπορεί να έχει πρόβλημα με τα Ελληνικά... Σε μια δική μου εμπειρία ο JCreator δεν μου αναγνωριζε τα Ελληνικά και είχα αναγκαστεί να καταφύγω στον NetBeans!

Δημοσ.

>
/* English -> Greek demo (c) DIRECTX
  Compiler: Borland C/C++ Builder 6.0
*/

#include <stdio.h>
#include <string.h>
#include <malloc.h>

#include <conio.h>

// Special header precompilation request for C/C++ Borland compilers
#ifdef   __BORLANDC__
#define hdrstop
#endif
////////////////////////////////////////////////////////////////////////////////
char  *InsertPh(char *pszString,char *pszPhonement);

char  *GRConv(char *pszString)
{
  int   nStrIdx,nTableIdx;
  char  bGreekTable  []  =  {'α','β','γ','δ','ε','ζ','η','ι',
                              'κ','λ','μ','ν','ξ','ο','π','ρ','σ',
                              'τ','υ','ω'
                             },
        bEnglishTable[]  =  {'a','b','g','d','e','z','h','i',
                              'k','l','m','n','x','o','p','r','s',
                              't','u','w'
                              },

        szCharStr     [2] =  "",

        *pszNewStr        =  NULL;

  // Run time char[] length calculation
  int   nTablesLen     =  (sizeof(bEnglishTable)/sizeof(char)),
        nUnknownChar;

  for(nStrIdx=0;nStrIdx<=strlen(pszString);nStrIdx++)
   {
     // Check 2 letters combinations
     if(!memcmp(&pszString[nStrIdx],"th",2))
      { pszNewStr=InsertPh(pszNewStr,"θ"); nStrIdx++; continue; }
     if(!memcmp(&pszString[nStrIdx],"ph",2))
      { pszNewStr=InsertPh(pszNewStr,"φ"); nStrIdx++; continue; }
     if(!memcmp(&pszString[nStrIdx],"ch",2))
      { pszNewStr=InsertPh(pszNewStr,"χ"); nStrIdx++; continue; }
     if(!memcmp(&pszString[nStrIdx],"ps",2))
      { pszNewStr=InsertPh(pszNewStr,"ψ"); nStrIdx++; continue; }

     // Check 1 letter  combinations
     nUnknownChar   =  1;
     for(nTableIdx=0;nTableIdx!=nTablesLen;nTableIdx++)
      {
        if(bEnglishTable[nTableIdx]==pszString[nStrIdx])
         {
           szCharStr[0]   =  bGreekTable[nTableIdx];
           pszNewStr=InsertPh(pszNewStr,szCharStr);
           nUnknownChar   =  0;
           break;
         }
      }

     // Unknown character, just include it!
     if(nUnknownChar)
      {
        szCharStr[0]=pszString[nStrIdx];
        pszNewStr=InsertPh(pszNewStr,szCharStr);
      }
   }

  return   pszNewStr;
}

char  *InsertPh(char *pszString,char *pszPhonement)
{
  // DONE: Append pszPhonement to pszString (realloc enough memory etc.)
  int   nEmptyBuffer   =  (pszString==NULL)?1:0,
        nNewBufferLen  =  strlen(pszPhonement)+1;

  if(!nEmptyBuffer)
   nNewBufferLen+=strlen(pszString);

  if((pszString=(char*)realloc(pszString,nNewBufferLen))==NULL)
   {
     if(pszString!=NULL)
      {
        free(pszString);
        return  NULL;
      }
   }

  if(nEmptyBuffer)
   memset(pszString,0,nNewBufferLen);

  return   strcat(pszString,pszPhonement);
}
////////////////////////////////////////////////////////////////////////////////
char  *pszEnglishII  =  "philosophi psychology fiasco thalamus qwertyuiopasdfghjklzxcvbnm",
     *pszGreek      =  NULL;
////////////////////////////////////////////////////////////////////////////////
int main()
{
  pszGreek       =  GRConv(pszEnglishII);
     printf(" %s\n",pszGreek);  // If under console, switch to ISO1253 "chcp 1253"
  free(pszGreek);

  printf(" Press a key to quit..");
  getch();

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

 

Ο παραπάνω κώδικα (γραμμένος σε Borland C/C++ Builder 6) μπορεί να μετατρέψει τα μικρά αγγλικά γράμματα στα αντίστοιχα ελληνικά, παράλληλα αντιλαμβάνεται ορισμένες αγγλικές δίφθογγους μετατρέποντας τις στα ανάλογα ελληνικά γράμματα με βάση τις ακολουθίες που εντόπισα στο http://www.constructionwork.com/resources_details_1256english_greek_alphabet.html?PHPSESSID=8108f3d5e16f4a086d3e6f20a23475d9'>http://www.constructionwork.com/resources_details_1256english_greek_alphabet.html?PHPSESSID=8108f3d5e16f4a086d3e6f20a23475d9 .

 

Η βασική ρουτίνα της εφαρμογής ονομάζεται GRConv, δέχεται ένα C string (char*) και επιστρέφει ένα νέο char* το οποίο αργότερα ο προγραμματιστής πρέπει να αποδεσμεύσει με την εντολή free.

 

Για την μετατροπή των απλών γραμμάτων της αγγλικής στα ελληνικά η GRConv χρησιμοποιεί δυο C πίνακες τύπου char (1 byte). Ο πρώτος πίνακας bGreekTable περιέχει τους ελληνικούς χαρακτήρες ενώ ο δεύτερος bEnglishTable τους αγγλικούς. Οι θέσεις των χαρακτήρων στους δυο πίνακες πρέπει να είναι ίδιες καθώς όταν ο κώδικας εντοπίζει έναν γνωστό αγγλικό χαρακτήρα στο bEnglishTable τον αντικαθιστά με τον ελληνικό χαρακτήρα που υπάρχει στην ίδια θέση του bGreekTable.

Ο υπολογισμός του μεγέθους των δυο πινάκων γίνεται με την εντολή nTablesLen = (sizeof(bEnglishTable)/sizeof(char)) (<-διαιρούμε το συνολικό μέγεθος του char πίνακα με το μέγεθος ενός char) παρά χειροκίνητα ώστε να καθίσταται εύκολη προσαρμογή των πινάκων στις μελλοντικές μας ανάγκες (προσθήκη ή αφαίρεση χαρακτήρων).

 

Επίσης η GRConv ελέγχει εάν το προς μετατροπή κείμενο περιέχει κάποια γνωστή αγγλική δίφθογγο η οποία αποδίδεται όμως ως ένα ελληνικό γράμμα (πχ. Ps = Ψ) με την βοήθεια της memcmp η οποία επιτρέπει τον έλεγχο σε επίπεδο διευθύνσεως για συγκεκριμένο αριθμό χαρακτήρων (memcmp(&pszString[nStrIdx],"th",2)) δίχως κίνδυνο buffer overrun. Εάν η memcmp επιστρέψει 0 τότε απλά προσθέτει το αντίστυχο ελληνικό γράμμα στο νέο char* προσαρμόζοντας (nStrIdx++) την συνέχεια του nStrIdx μεταβαίνοντας (continue) ύστερα στο βασικό for.

 

Τέλος εάν ο προς μετατροπή χαρακτήρας είναι άγνωστος τότε απλά προστίθεται στο νέο char*.

 

Κλείνοντας, η GRConv χρησιμοποιεί την ρουτίνα InsertPh (δλδ. InsertPhonetic) η οποία ουσιαστικά δεσμεύει την απαραίτητη μνήμη (realloc & υπολογισμός μεγέθους) για το νέο μεταφρασμένο char* προσθέτοντας σε αυτό νέα στοιχεία (strcat) μορφής C string (char* για αυτό και όταν προσθέτουμε chars δλδ. bytes χρησιμοποιούμε την szCharStr ως έμμεσο τρόπο, placeholder προ της InsertPhonetic).

 

Υ.Γ.

1. Ορισμένα αγγλικά γράμματα όπως το f σύμφωνα με το http://www.constructionwork.com/resources_details_1256english_greek_alphabet.html?PHPSESSID=8108f3d5e16f4a086d3e6f20a23475d9 δεν αποδίδονται άμεσα στα ελληνικά καθώς Φ = Ph (Philosophy) όμως από την άλλη πλευρά η λέξη Fiasco (αν και λατινική, υπάρχει σε κάθε αγγλικό λεξικό) πρέπει παρʼ αυτά να μεταφραστεί σε Φιασκο οπότε εδώ Φ = F, παρόμοιο πρόβλημα έχουμε με το C που πρέπει να αποδοθεί ως K ( C = K ) ή την Y = υ κτλ..

Για αυτές τις περιπτώσεις όπως επίσης και για την απόδοση στα κεφαλαία δεν ασχολήθηκα αφού σκοπός του source είναι η επιδείξει μια πιθανής λύσης και όχι η λύση συνολικά (αν και δεν απέχει πολύ).

 

2. Ο κώδικας δεν ελέγχει για αποτυχία (NULL) στην κλήση InsertPh (προσπάθησα να είναι καθαρός -straightforward- όσο γίνεται), ενώ δεν αποκλείεται να υπάρχουν μικρές αβλεψίες στην διαχείριση της μνήμης, πάντως είναι αρκετός για να επιδειχθεί η χρήση tables και ο εντοπισμός – διαχείριση διφθόγγων.

 

3. Εάν εκτελεσθεί σε console, τότε γυρίστε σε DOS-BOX mode (window), βάλτε ως font την Lucida, και δώστε chcp 1253 ώστε να φορτωθεί η ελληνική κωδικο-σελίδα.

 

4. Οι λέξεις που έχω επιλέξει (philosophi psychology fiasco thalamus) επιδεικνύουν την λειτουργία σε φθόγγους αλλά και τα προβλήματα μετάφρασης (πχ. fiasco) που προανέφερα (qwertyuiopasdfghjklzxcvbnm).

 

Όπως και να έχει ελπίζω να φανεί χρήσιμος,

Καλή συνέχεια!

:)

Δημοσ.

Egw pali tha soy protina na pas na katevaseis to programma "magic file renamer" poy tha to vreis sto site : http://www.finebytes.com/mfr/

afoy mporeis mesa se ena txt arxeio na toy dilwseis esi se ti thes na metatrepsei kathe gramma elliniko h' aggliko. emena me exei volepsei aperiorista otan thelw na metatrepw ellinika mp3 se greeklish gia na mporw na ta vlepw kai se mp3 player.

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

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

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