Παιδιά σας χαιρετώ.
Έχουμε ένα αρχείο που είναι το output από ένα πρόγραμμα. Αυτό το αρχείο εξόδου περιέχει ελληνικούς χαρακτήρες αλλά δεν μπορούμε να τους διαβάσουμε λόγω encoding. Μέχρι σήμερα παίρναμε αυτό το output file και με ένα προγραμματάκι γραμμένο σε VB κάναμε την μετάφραση των χαρακτήρων ένα προς ένα.
Αυτό που θέλω να ρωτήσω τους experts των Unix είναι.
1) Υπάρχει εντολή που αλλάζει το encoding στα Unix αυτόματα;
2) Υπάρχει τρόπος να τρέχει ένα windows exe σε Unix ;
1) Υπάρχει εντολή και ονομάζεται iconv. Την εκτελείς δίνοντας συνήθως δύο παραμέτρους, την αρχική και την τελική κωδικοποίηση. Για παράδειγμα, η εντολή iconv -f iso-8859-7 -t utf-8 < input_file > output_file μετατρέπει το αρχείο εισόδου input_file με κωδικοποίηση ελληνικών iso-8859-7 σε αρχείο εξόδου output_file με κωδικοποίηση utf-8. Εξίσου συνηθισμένη στα ελληνικά είναι και η κωδικοποίηση cp1253 (Windows-1253) η οποία έχει ελάχιστες διαφορές από την iso-8859-7 (π.χ. το κεφαλαίο άλφα με τόνο). Μια άλλη παράμετρος, είναι η -c η οποία φροντίζει να παραλείψει χαρακτήρες που είναι invalid.
2) Υπάρχει τρόπος, ο πιο γνωστός είναι το Wine και η αντίστοιχη βιβλιοθήκη (Winelib)για προγραμματιστές που θέλουν να μεταγλωττίσουν και να προσαρμόσουν (δηλαδή, να κάνουν port) τις Windows εφαρμογές τους σε Linux, Unix, κτλ.
ΥΓ. Εναλλακτικά μπορείς, αν θέλεις, να δοκιμάσεις το Charco που φαίνεται να δουλεύει και κάτω από Windows (σημειώνεται ότι δεν το έχω δοκιμάσει).
-- Νεόφυτος Δημητρίου ~k2pts, March 30, 2008
Στα Windows το WinMerge υποστηρίζει unicode. Μάλλον κάποιος αντίστοιχος editor θα το υποστηρίζει και σε unix.
Unicode συναντά κάποιος σε utf-8 μορφή ή σε utf-16 "unicode" δηλαδή 2 bytes ανά χαρακτήρα. Υπάρχει και utf-32, αλλά δεν χρησιμοποιείται (ακόμα), και χρειάζεται για χαρακτήρες ασιατικών γλωσσών και άλλα παράξενα σύμβολα που προστέθηκαν πολύ αργότερα στους πίνακες unicode.
Στο διαδίκτυο κυριαρχεί το utf-8, και μπορεί να κωδικοποιήσει οποιοδήποτε χαρακτήρα με την χρήση sequences. Το utf-16 είναι πιο βολικό για τον προγραμματιστή.
-- Σωτήρης Στυλιανού ~virtual, April 01, 2008
Νεόφυτε ,
Αρχικά οφείλω να σου πω πως έκαμα την δουλειά μου με την εντολή iconv όπως είπες. Ευχαριστώ.
Τώρα προέκυψε ένα άλλο πρόβλημα. Το text file με τα κινέζικα περιέχει πχ 100 εγγραφές χωρισμένες σε 3 στήλες. Όταν τρέξω την εντολή iconv μεταφράζει μεν τα κινέζικα αλλά χαλάει η ευθυγράμμιση των 3 στηλών. Μπορώ να κάνω κάτι για αυτό; Ευχαριστώ πολύ.
-- Ανδρέας Φλωρίδης ~flo, May 30, 2008
Πως αναγνωρίζονται οι στήλες σου στο αρχικό και στο τελικό κείμενο; Έχει, δηλαδή, η κάθε στήλη συγκεκριμένο μήκος, ή χωρίζεται με συγκεκριμένο διαχωριστικό χαρακτήρα; Αν μας δώσεις κανένα παράδειγμα ίσως να μπορέσουμε να βοηθήσουμε παραπάνω.
-- Χρίστος Ευαγγέλου ~christose, May 30, 2008
Κάθε στήλη έχει καθορισμένο μήκος. Ξέρω πχ πως η στήλη Α έχει μήκος 30 χαρακτήρες από την θέση 1 - 30 , η στήλη Β έχει μήκος 10 χαρακτήρες από την θέση 31 - 40 , και η στήλη Γ έχει μήκος 20 χαρακτήρες από την θέση 41 - 60.
Το πρόβλημα έχει ως εξής. Έστω ότι στην στήλη Α υπάρχουν 8 κινέζικοι χαρακτήρες ******** . Με την εντολή
iconv -f UTF-8 -t ISO8859-7 files/flo_test.txt > files/floout_new.txt
οι 8 κινέζικοι χαρακτήρες μεταφράζονται στην λέξη "γάτα" που έχει μόνο 4 χαρακτήρες. Αυτό έχει ως αποτέλεσμα να χαλάει η ευθυγράμμισή των στηλών μου.
Για να λύσουμε αυτό το πρόβλημα έχουμε γράψει 2 προγραμματάκια σε vb. Το πρώτο κάνει το encoding προσθέτοντάς μπροστά από κάθε ελληνικό γράμμα το σύμβολο ~ . Δηλαδή στο παράδειγμα πιο πάνω μεταφράζει τους 8 κινέζικους χαρακτήρες στη λέξη ~γ~ά~τ~α που έχει και αυτή 8 χαρακτήρες επομένως δεν μου χαλάει η ευθυγράμμιση. Το δεύτερο πρόγραμμα τρέχει σε επόμενο στάδιο και αφαιρεί τα ~ .
Οι ερωτήσεις μου είναι :
1) Μπορώ να αλλάζω το encoding χωρίς να μου χαλάει η ευθυγράμμιση ;
2) Αν όχι , μπορώ με κάποιες εντολές UNIX να προσθέτω και να αφαιρώ το σύμβολο ~ ;
3) Υπάρχει κανένας πιο εύκολος τρόπος να κάνω αυτό που θέλω;
Ευχαριστώ
-- Ανδρέας Φλωρίδης ~flo, June 02, 2008
Υπάρχει ένας καταπληκτικός τρόπος που θα σε βοηθήσει στο 2 και στο 3 αλλά πιθανόν όχι (άμεσα) στο 1. Να ζητήσεις να πάεις training σε unix! Είναι κάτι πολύ χρήσιμο και θα σε βοηθήσει πολύ! Αν η εταιρεία που δουλεύεις σε θέλει να ασχολείσαι με συστήματα unix τότε το ελάχιστο που μπορεί να κάνει είναι να σε εκπαιδεύσει σε αυτό!
-- Κωνσταντίνος Κωνσταντίνου ~constandinos, June 02, 2008
Ανδρέα, υπάρχει διαχωριστικό μεταξύ των στηλών. Κάποιο space, ή κάποιο tab, με το οποίο μπορούμε να σπάσουμε το περιεχόμενο σε στήλες, ώστε να κάνουμε την μετατροπή ανά στήλη;
-- Χρίστος Ευαγγέλου ~christose, June 02, 2008
Χρίστο , ίσως να παρουσίασα την κατάσταση πιο απλή από ότι είναι.
Ξαναλέω το πρόβλημα.
Υπάρχει ένα text αρχείο με πολλές γραμμές. Αν πχ μια γραμμή ξεκινά από τον αριθμό 1000 τότε εγώ πρέπει να πιάσω το string που βρίσκεται στην θέση 200 - 300 της γραμμής αυτής. Αν η γραμμή ξεκινά από 2000 τότε θέλω το string που βρίσκεται στην θέση 320 - 330 εκείνης της γραμμής κτλ κτλ. Οι γραμμές ΔΕΝ έχουν το ίδιο μήκος και ΔΕΝ χωρίζονται σε στήλες. Οι λέξεις της κάθε γραμμής χωρίζονται με space. Για παράδειγμα οι γραμμές μπορεί να είναι
1000 Αντρέας Παλουρίωτισαα 3045 ΑΡ
2000 ΤΕΣΤ ΤΕΣΤ
3000 Ι ΝΕΕD THIS
Όπως καταλαβαίνεις δουλεύουμε με σχετικές θέσεις μέσα στο αρχείο επομένως τίποτα δεν πρέπει να αλλάξει θέση κατά την αλλαγή του encoding.
-- Ανδρέας Φλωρίδης ~flo, June 02, 2008
Νομίζω θα δυσκολευτείς να κάνεις κάτι τέτοιο, χωρίς χρήση κάποιας γλώσσας scripting, πέραν του shell.
-- Χρίστος Ευαγγέλου ~christose, June 02, 2008
Ίσως αυτό σκριπτάκι PHP να βοηθήσει:
<?php if (!($fp = fopen('c:\tmp\new.txt','r'))) die("Error: Cannot open file."); while (!feof($fp)) { $aLine = fgets($fp); $allWords = preg_split("/([ \n\r\t]+)/",$aLine,-1,PREG_SPLIT_DELIM_CAPTURE); // Find all words; put them in an array. foreach ($allWords as $word) { $l = strlen($word); // Remember word's length before conversion. $w = iconv("UTF-8","ISO-8859-7", $word); // Convert. printf("%-{$l}s",$w); // Print word. Pad with spaces to match word's length. } } ?>Το "c:\tmp\new.txt" θα πρέπει να αλλαχτεί με το αρχείο το οποίο θέλεις να μετατρέψεις.
-- Χρίστος Ευαγγέλου ~christose, June 03, 2008