evagelos_21 Δημοσ. 25 Απριλίου 2006 Δημοσ. 25 Απριλίου 2006 παιδιά θέλω να κάνω μια ερώτηση. θέλω να μετατρέψω μια σειρά απο χαρακτήρες απο αγγλικούς σε ελληνικούς. πχ: vaggelis σε βαγγελης, rock σε ροκκ μήπως έχει κανείς καμιά ιδέα;
capthookb Δημοσ. 25 Απριλίου 2006 Δημοσ. 25 Απριλίου 2006 Φτιάξε ένα πίνακα με τις αντιστοιχίες που θες, και μετά εξετάζοντας γράμμα γράμμα κάθε λέξη, κάνεις τη μετατροπή
Steven1985 Δημοσ. 25 Απριλίου 2006 Δημοσ. 25 Απριλίου 2006 Με το word το είχα κάνει πριν κάτι χρόνια, αλλά δεν θυμάμαι καθόλου τώρα...
kath Δημοσ. 25 Απριλίου 2006 Δημοσ. 25 Απριλίου 2006 Φτιαχνεις μια array με ολα τα γραμματα της Ελληνικης αλφαβητου , και μια της αγγλικης. πχ : string *Eng[27]; string *Ell[24]; Τωρα ,αποθηκευσε το string κειμενου σε ενα buffer , και ξεκινα να διαβαζεις καθε χαρακτηρα (εναρξη γραμμης=-1 , τελος = μηκος χαρακηρων string). και ξεκινα να αποθηκευεις καπως ετσι : while ( (buff !=" ") | (buff!="") ) { αναζητηση εαν βρεθει χαρακτηρας τοτε,βρες τη θεση του στο string, συγκρινε τον με την array και βρες ποιο χαρακτηρα πρεπει να αντικαταστησεις.. }
Legionnaire Δημοσ. 25 Απριλίου 2006 Δημοσ. 25 Απριλίου 2006 Φτιαχνεις μια 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.
dterzakis Δημοσ. 25 Απριλίου 2006 Δημοσ. 25 Απριλίου 2006 Πιστεύω ότι μπορείς να πας στο word και με το replace (Ctrl + H) μπορείς να αλλάξεις όλα τα γράμματα κάνοντας το 26 φορές!! ....
capthookb Δημοσ. 25 Απριλίου 2006 Δημοσ. 25 Απριλίου 2006 Πιστεύω ότι μπορείς να πας στο word και με το replace (Ctrl + H) μπορείς να αλλάξεις όλα τα γράμματα κάνοντας το 26 φορές!! .... Κάτι τέτοιο όμως θεωρείται προγραμματισμός;
Legionnaire Δημοσ. 25 Απριλίου 2006 Δημοσ. 25 Απριλίου 2006 Καταρχήν όλα στηρίζονται στον πίνακα ASCII (αν δεν ξέρεις τι είναι, google it). Από εκεί και μέτα το ελληνικό κεφαλαίο γράμμα Άλφα έχει τον κωδικό αριθμό (στο δεκαδικό) 193 και το αντίστοιχο αγγλικό κεφαλαίο γράμμα έχει το 65. Επίσης το ελληνικό κεφαλαίο Βήτα έχει το 194 και το αντίστοιχο αγγλικό το 66. Κλπ κλπ. Όπως βλέπεις κάθε ελληνικό γράμμα απέχει από το αντίστοιχο αγγλικό του ακριβώς 128. Οπότε π.χ. για να πάρεις το C, κάνεις 'Γ'-128. Έτσι ο κώδικάς σου θα είναι 5 γραμμές! Μπορώ να σου το δώσω ακριβώς άμα θες. Βέβαια μπορεί κάποιος να προτιμάει μια διαφορετική αντιστοίχιση όπως το ελληνικό 'Β' να μεταφράζεται ως 'V'. Τότε θα ακολουθήσεις μια διαφορετική προσέγγιση. Αυτή καλύπτει και τους φθόγγους μπ, ντ, τζ, κλπ. Θα χρειαστείς, όπως σου είπαν και οι υπόλοιποι, έναν πίνακα με όλες τις αντιστοιχίσεις (οι οποίες είναι περισσότερες από 24 αν συμπεριλάβεις και τους φθόγγους). Εγώ όμως σου προτείνω να μην τον φτιάξεις μέσα στον κώδικα του προγράμματος αλλά σε ένα εξωτερικό αρχείο txt και να τον διαβάζεις κάθε φορά στην αρχή του προγράμματος. Έτσι με τον ίδιο ακριβώς κώδικα και αλλάζοντας το εξωτερικό αρχείο txt, το πρόγραμμά σου θα μπορεί να μετατρέπει ό,τι θες και σε κάτι άλλο (π.χ. english σε l33t ή κάποιο αλφάβητο σε αριθμούς σαν κάποιο είδος κρυπτογράφησης).
dterzakis Δημοσ. 25 Απριλίου 2006 Δημοσ. 25 Απριλίου 2006 Κάτι τέτοιο όμως θεωρείται προγραμματισμός; μάλλον όχι, πιο πολύ μπακαλισμός απλά σε αυτό που ειπόθηκε πιο πάνω με το word απάντησα:oops:
Legionnaire Δημοσ. 25 Απριλίου 2006 Δημοσ. 25 Απριλίου 2006 Τελικά που ακριβώς θέλει να κάνει αυτή τη μετατροπή; Πάντως όπου και να την θέλει, μια λύση σε Java είναι global
dterzakis Δημοσ. 26 Απριλίου 2006 Δημοσ. 26 Απριλίου 2006 Αν είναι σε Java μπορεί να έχει πρόβλημα με τα Ελληνικά... Σε μια δική μου εμπειρία ο JCreator δεν μου αναγνωριζε τα Ελληνικά και είχα αναγκαστεί να καταφύγω στον NetBeans!
Directx Δημοσ. 26 Απριλίου 2006 Δημοσ. 26 Απριλίου 2006 > /* 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). Όπως και να έχει ελπίζω να φανεί χρήσιμος, Καλή συνέχεια!
fits13 Δημοσ. 26 Απριλίου 2006 Δημοσ. 26 Απριλίου 2006 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.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.