Μαζική μετατροπή σε UTF-8 (utility)

Κώδικας, πληροφορίες, ερωτήσεις και απαντήσεις σχετικές με την JavaScript.

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
Άβαταρ μέλους
skeftomilos
Script Master
Δημοσιεύσεις: 2888
Εγγραφή: 07 Ιαν 2005 07:22
Τοποθεσία: Αθήνα

Μαζική μετατροπή σε UTF-8 (utility)

Δημοσίευση από skeftomilos » 28 Δεκ 2005 01:57

Τις προάλλες ρώτησα ένα φίλο αν ήξερε κανένα πρόγραμμα για μαζική μετατροπή αρχείων από ASCII σε UTF-8 encoding. Μου απάντησε πολύ λογικά ότι δε θα με παραδεχόταν ως προγραμματιστή αν δε μπορούσα να φτιάξω ο ίδιος ένα τέτοιο πρόγραμμα. Μου πρότεινε μάλιστα να χρησιμοποιήσω τις συναρτήσεις που παρέχει το API των Windows (MultiByteToWideChar & WideCharToMultiByte). Όπως φαντάζεστε αυτή η προοπτική δε με ενθουσίασε ιδιαίτερα, θα προτιμούσα κάτι σε μορφή script.

Η πρώτη σκέψη είναι μία utility με τον WSH. Δυστυχώς όμως το γνωστό και οικείο FileSystemObject δε μπορεί να βοηθήσει σε αυτή την περίπτωση, καθώς αδυνατεί να διαβάσει και να γράψει UTF-8 αρχεία. Η μέθοδος OpenTextFile δέχεται ένα όρισμα με όνομα format, αλλά οι δυνατές τιμές είναι μόνο για ASCII και Unicode, όχι UTF-8.

Η δεύτερη σκέψη είναι μία utility .ΝΕΤ. Οι περισσότεροι θα έχετε ακούσει για το .NET Framework της Microsoft, και θα ξέρετε ότι είναι προσβάσιμο με διάφορες γλώσσες προγραμματισμού. Ξέρετε όμως ότι ανάμεσα στις γνωστές VB.NET, C#, J# και C++ βρίσκεται και η JScript.NET; Όπως και νά 'χει, είναι μια καλή ευκαιρία να δούμε με τι μοιάζει αυτή η γλώσσα.

ASCII-To-UTF8.js

Κώδικας: Επιλογή όλων

import System
import System.IO
import System.Text
import System.Windows.Forms

var args : String[]
// Αφαίρεση του πρώτου argument, γιατί είναι το όνομα αρχείου του ίδιου του script.
args = new String[Environment.GetCommandLineArgs().Length - 1]
System.Array.Copy(Environment.GetCommandLineArgs(), 1, args, 0, args.Length)

if &#40;args.Length < 1&#41; &#123;
  MessageBox.Show&#40;'Insufficient arguments.', 'UTF-8 Conversion'&#41;
  Environment.Exit&#40;1&#41;
&#125;

var msg    &#58; String
var result &#58; DialogResult

msg = 'Μετατροπή ' + &#40;&#40;args.Length == 1&#41; ? 'ενός αρχείου' &#58; args.Length + ' αρχείων'&#41; + ' σε UTF-8 encoding.'
msg += '\n\nΕπιβεβαίωση;'
result = MessageBox.Show&#40;msg, 'UTF-8 Conversion', MessageBoxButtons.YesNo, MessageBoxIcon.Question&#41;
if &#40;result != DialogResult.Yes&#41; Environment.Exit&#40;0&#41;

var fileName &#58; String
var fileInfo &#58; FileInfo
var stream   &#58; FileStream
var reader   &#58; StreamReader
var data     &#58; String
var writer   &#58; StreamWriter
var i        &#58; int

var changedFiles = &#91;&#93;
var unchangedFiles = &#91;&#93;

for &#40;i = 0; i < args.Length; i++&#41; &#123;
  fileName = args&#91;i&#93;
  if &#40;File.Exists&#40;fileName&#41;&#41; &#123;
    // Ανάγνωση του αρχείου.
    stream = File.OpenRead&#40;fileName&#41;
    reader = new StreamReader&#40;stream, Encoding.Default, true&#41; //detectEncodingFromByteOrderMarks
    data = reader.ReadToEnd&#40;&#41;
    reader.Close&#40;&#41;

    fileInfo = new FileInfo&#40;fileName&#41;
    
    // Έλεγχος αν είναι ASCII.
    if &#40;data.Length == fileInfo.Length&#41; &#123;
      // Μετατροπή.
      stream = File.Open&#40;fileName, FileMode.Truncate, FileAccess.ReadWrite&#41;
      writer = new StreamWriter&#40;stream, System.Text.Encoding.UTF8&#41;
      writer.Write&#40;data&#41;
      writer.Close&#40;&#41;
      changedFiles.push&#40;fileInfo.Name&#41;
    &#125; else &#123;
      unchangedFiles.push&#40;fileInfo.Name&#41;
    &#125;
  &#125;
&#125;

msg = 'Μετατροπή ' + &#40;&#40;changedFiles.length == 1&#41; ? ' ενός αρχείου.' &#58; changedFiles.length + ' αρχείων.'&#41;
if &#40;changedFiles.length&#41; msg += '\n- ' + changedFiles.join&#40;'\n- '&#41;

if &#40;unchangedFiles.length&#41; &#123;
  msg += '\n\nΠαράλειψη ' + &#40;&#40;unchangedFiles.length == 1&#41; ? ' ενός αρχείου.' &#58; unchangedFiles.length + ' αρχείων.'&#41;
  msg += '\n- ' + unchangedFiles.join&#40;'\n- '&#41;
&#125;

MessageBox.Show&#40;msg, 'UTF-8 Conversion'&#41;
Προορισμός αυτού του script είναι να τοποθετηθεί στο φάκελο SendTo. Εκεί θα είναι εύκολα προσβάσιμο με δεξί κλικ στα αρχεία που θέλουμε να μετατρέψουμε σε UTF-8:

Εικόνα

Εικόνα

Εικόνα

Όμως δε γίνεται να χρησιμοποιήσουμε το script όπως είναι, πρέπει πρώτα να το μεταγλωττίσουμε. Πώς; :o Ναι, δυστυχώς πρέπει να περάσουμε τον .NET κώδικα από την ενοχλητική και βαρετή διαδικασία του compilation. Για να γίνει όσο το δυνατόν πιο ανώδυνη φτιάχνουμε ένα αρχείο bat που να περιέχει τα εξής:

ASCII-To-UTF8_MAKE.bat

Κώδικας: Επιλογή όλων

C&#58;\WINDOWS\Microsoft.NET\Framework\v1.1.4322\jsc.exe /codepage&#58;1253 /target&#58;winexe /warn&#58;2 ASCII-To-UTF8.js
@pause
Αρκεί τώρα να κάνουμε διπλό κλικ στο αρχείο για να δημιουργηθεί το εκτελέσιμο ASCII-To-UTF8.exe, το οποίο θα τοποθετήσουμε στο φάκελο SendTo. Απαραίτητη προϋπόθεση είναι να έχουμε εγκατεστημένο στον υπολογιστή μας το .NET Framework 1.1. Αν δεν υπάρχει θα πρέπει να το κατεβάσουμε από το site της Microsoft: .NET Framework 1.1 (~23 MB)

Το αρχείο jsc.exe είναι ο θρυλικός compiler της JScript.NET. Αν μου πείτε ότι γνωρίζατε ήδη την ύπαρξή του ... θα δυσκολευτώ να σας πιστέψω! :)

Μερικές παρατηρήσεις για τον προγραμματισμό με JScript.NET. Κατ' αρχήν η γλώσσα είναι πλήρως συμβατή με τη γνωστή και καλή JavaScript (backward compatible). Διαθέτει όμως πολλές επιπλέον δυνατότητες προς την κατεύθυνση των καταξιωμένων object oriented γλωσσών όπως η Java. Επιτρέπεται η δημιουργία κλάσεων (class-based objects), υπάρχουν scope-modifiers (private, protected, public), καθώς και τα απαραίτητα σύνεργα για μονή κληρονομικότητα (abstract, extends, implements, final κ.λπ.). Υπάρχει και ο ενδιαφέρον modifier expando, για τη δημιουργία αντικειμένων που να είναι ταυτόχρονα επεκτάσιμα και class-based.

Προσωπικά νοιώθω να υπάρχει ολίγη δόση σχιζοφρένειας σε όλη αυτή την προσπάθεια συγκερασμού δύο πολύ διαφορετικών στυλ προγραμματισμού. Από τη μια το παλιό εύπλαστο, ρευστό και λακωνικό στυλ μιας δυναμικής γλώσσας, και από την άλλη η αυστηρότητα και οι μακροσκελείς εκφράσεις μιας strongly-typed προσέγγισης. Πάντως δεν πρόκειται για μια ακόμα παραξενιά της Microsoft. Η JScript.NET είναι μια πλήρης υλοποίηση του W3C προτύπου ECMA 4, ή JavaScript 2 στην ορολογία της ομάδας Mozilla. Είναι μάλλον σίγουρο ότι σε λίγα χρόνια θα υποστηρίζεται από μια ευρεία γκάμα από browsers, και θα είναι μέρος της καθημερινότητας στο Web.

Δύο σημεία σχετικά με το πρόγραμμα. Στο .NET Framework τα command line arguments διαβάζονται συνήθως από τα ορίσματα της ρουτίνας Main(). Για παράδειγμα στην C#:

Κώδικας: Επιλογή όλων

public class Demo
&#123;
  public static void Main&#40;string&#91;&#93; args&#41;
  &#123;
    System.Console.WriteLine&#40;"Number of command line parameters = &#123;0&#125;", args.Length&#41;;
  &#125;
&#125;
Στην JScript.NET δεν υπάρχει το concept της ρουτίνας Main(), και για την ανάγνωση των command line arguments πρέπει να χρησιμοποιηθεί η μέθοδος System.Environment.GetCommandLineArgs().

Ίσως παρατηρήσατε μέσα στον κώδικα την ιδιότητα Length γραμμένη άλλοτε με μικρό και άλλοτε με κεφαλαίο L. Δεν πρόκειται για ασυνέπεια. Άλλωστε η JavaScript είναι case-sensitive γλώσσα, και αν βρει τέτοια λάθη θα διαμαρτυρηθεί έντονα. Η εξήγηση είναι ότι ξαφνικά έχουμε να κάνουμε με δύο πολύ διαφορετικά ήδη arrays στον κώδικά μας. Από τη μια τα «μαλακά» JavaScript arrays με πολλές και διάφορες ιδιότητες όπως length, slice(), sort(), push() κ.λπ., και από την άλλη τα «σκληρά» .NET arrays με εντελώς διαφορετικές ιδιότητες όπως Length, IsReadOnly, CopyTo() κ.λπ. Όποιος γράφει κώδικα JScript.NET θα πρέπει να εξοικειωθεί με αυτό το σχετικό αλαλούμ.

Αφού φτιάχτηκε το πρόγραμμα ASCII-To-UTF8 ήταν ακετά εύκολο να φτιαχτεί και ένα πρόγραμμα για την αντίστροφη μετατροπή -> UTF8-To-ASCII. Επίσης θα ήταν χρήσιμο κι ένα προγραμματάκι που να μας λέει αν ένα αρχείο είναι UTF-8 ή όχι -> IsUTF8. Και τα τρια scripts μαζί με τα bat για το compilation βρίσκονται σε αυτό το zip -> utf8-converter.zip. :)
Τελευταία επεξεργασία από το μέλος skeftomilos την 28 Δεκ 2005 03:12, έχει επεξεργασθεί 1 φορά συνολικά.
The pure and simple truth is rarely pure and never simple. Ο μη νους δε σκέπτεται μη σκέψεις για το τίποτα.

Άβαταρ μέλους
ThyClub
Honorary Member
Δημοσιεύσεις: 5312
Εγγραφή: 17 Νοέμ 2003 00:21
Τοποθεσία: Hell's Kitchen
Επικοινωνία:

Μαζική μετατροπή σε UTF-8 (utility)

Δημοσίευση από ThyClub » 28 Δεκ 2005 02:59

Εικόνα

Cmg__
Δημοσιεύσεις: 1710
Εγγραφή: 29 Μαρ 2005 22:40

Μαζική μετατροπή σε UTF-8 (utility)

Δημοσίευση από Cmg__ » 29 Δεκ 2005 02:02

:victory: :victory: :victory: :victory: :victory: :victory: :victory: :victory: :victory: :victory: :victory: :victory: :victory: :victory: :victory: :victory: :victory: :victory: :victory: :victory: :victory: :victory:

Άβαταρ μέλους
thomaspb
Δημοσιεύσεις: 4
Εγγραφή: 09 Οκτ 2003 11:16
Τοποθεσία: Βούλγαρη 32 και Ι.Πολέμη 13
Επικοινωνία:

Μαζική μετατροπή σε UTF-8 (utility)

Δημοσίευση από thomaspb » 29 Δεκ 2005 17:35

:D :D :D :D
Kalo. Bravo.

Άβαταρ μέλους
changlee
Δημοσιεύσεις: 370
Εγγραφή: 13 Φεβ 2005 00:46
Τοποθεσία: Πειραιάς
Επικοινωνία:

Μαζική μετατροπή σε UTF-8 (utility)

Δημοσίευση από changlee » 29 Δεκ 2005 23:46

Μώλις ανεβήκαμε σκαλί!

emphasy
Honorary Member
Δημοσιεύσεις: 4303
Εγγραφή: 16 Ιαν 2005 10:31

Μαζική μετατροπή σε UTF-8 (utility)

Δημοσίευση από emphasy » 30 Δεκ 2005 17:15

OMG Perfect! :D Excellent!

c3250
Δημοσιεύσεις: 3
Εγγραφή: 27 Οκτ 2003 01:39

Μαζική μετατροπή σε UTF-8 (utility)

Δημοσίευση από c3250 » 02 Ιαν 2006 01:03

ΧΡΟΝΙΑ ΠΟΛΛΑ ΣΕ ΟΛΟΥΣ
Εμεις οι ασχετοι σε ποιον φακελο θα το αντιγραψουμε????
Βοηθεια Παρακαλω.

Άβαταρ μέλους
dimsis
Reporter
Δημοσιεύσεις: 7994
Εγγραφή: 25 Ιούλ 2001 03:00

Μαζική μετατροπή σε UTF-8 (utility)

Δημοσίευση από dimsis » 02 Ιαν 2006 11:35

Nice...

Υπάρχει και το Unifier που έχω χρησιμοποιήσει στο παρελθόν (όταν βγήκε το Coldfusion 6.1 και έπρεπε να μετρατρέψουμε όλες τις εφαρμογές μας σε UTF-8 για να είμαστε εντάξει.. ΜΕΓΑΛΗ ΠΙΚΡΑ!)
http://www.melody-soft.com/html/unifier.html

και τώρα όποτε χρειάζομαι να μετατρέψω κάτι σε UTF-8, το ανοίγω στο πρόχειρο των Windows XP GR, και αποθήκευση ως, από ANSI σε Unicode... (ή utf-8 με BOM από Dreamweaver)

Άβαταρ μέλους
skeftomilos
Script Master
Δημοσιεύσεις: 2888
Εγγραφή: 07 Ιαν 2005 07:22
Τοποθεσία: Αθήνα

Μαζική μετατροπή σε UTF-8 (utility)

Δημοσίευση από skeftomilos » 02 Ιαν 2006 11:40

c3250 έγραψε:ΧΡΟΝΙΑ ΠΟΛΛΑ ΣΕ ΟΛΟΥΣ
Εμεις οι ασχετοι σε ποιον φακελο θα το αντιγραψουμε????
Βοηθεια Παρακαλω.
Ο φάκελος είναι ο C:\Documents and Settings\<ΤοΌνομάΣου>\SendTo, και το μόνο πρόβλημα είναι ότι είναι κρυμμένος (hidden). Μπορείς να αλλάξεις τις ρυθμίσεις του Windows Explorer για να δείχνει όλα τα κρυμμένα αρχεία και φακέλους, ή μπορείς να αλλάξεις τον ίδιο το φάκελο από κρυφό σε φανερό. Έτσι κι αλλιώς δεν υπάρχει ιδιαίτερος λόγος να είναι κρυφός ο φάκελος, δεν υπάρχει τίποτα να χαλάσει.

Η τεχνική SendTo είναι μια έξυπνη ιδέα του AlkisG. Μπορείς να διαβάσεις πιο αναλυτικά πώς δουλεύει στο «Φτιάξτε μόνοι σας χρήσιμα utilities με JavaScript».
The pure and simple truth is rarely pure and never simple. Ο μη νους δε σκέπτεται μη σκέψεις για το τίποτα.

Άβαταρ μέλους
Hermeia
Honorary Member
Δημοσιεύσεις: 987
Εγγραφή: 02 Αύγ 2004 00:14
Τοποθεσία: Αθήνα
Επικοινωνία:

Μαζική μετατροπή σε UTF-8 (utility)

Δημοσίευση από Hermeia » 06 Ιαν 2006 12:40

το script το 1ου μηνυματος ειναι φανερα win-only

υπαρχει οτιδήποτε για άλλα συστήματα ?
- βασικα για unix-οειδη ανοιχτου κωδικα,
για macintosh .. γενικά για τους "αόρατους" χρήστες που οι παραθυράδες κάνουν ότι δεν υπάρχουν ..

θενκς
Hermeia the InfoSharer
Η Γνώση είναι Δύναμη
Εικόνα

Άβαταρ μέλους
skeftomilos
Script Master
Δημοσιεύσεις: 2888
Εγγραφή: 07 Ιαν 2005 07:22
Τοποθεσία: Αθήνα

Μαζική μετατροπή σε UTF-8 (utility)

Δημοσίευση από skeftomilos » 06 Ιαν 2006 20:16

Ειδικά για τη JavaScript ίσως να μη μπορεί να χρησιμοποιηθεί ως γλώσσα scripting στο Unix, αλλά μπορεί να κάνω λάθος. Απ' όσο ξέρω οι πιο συνηθισμένες επιλογές είναι Perl και Python scripts. Όσο για την τεχνική SendTo, αν και βασίζεται σε συγκεκριμένο χαρακτηριστικό του περιβάλλοντος των Windows, δεν αποκλείεται να έχει αντιγραφεί από κάποιο από τα γραφικά κελύφη για Linux. Γενικά σε τέτοια θέματα τα λειτουργικά συστήματα δανείζονται ιδέες το ένα από το άλλο.
The pure and simple truth is rarely pure and never simple. Ο μη νους δε σκέπτεται μη σκέψεις για το τίποτα.

Άβαταρ μέλους
cordis
Administrator, [F|H]ounder, [C|S]EO
Δημοσιεύσεις: 27616
Εγγραφή: 09 Οκτ 1999 03:00
Τοποθεσία: Greece
Επικοινωνία:

Μαζική μετατροπή σε UTF-8 (utility)

Δημοσίευση από cordis » 22 Μαρ 2007 15:46

κι έκανα αναζήτηση στο google για να βρεθώ πάλι εδώ.. :P :lol:
Δεν απαντάω σε προσωπικά μηνύματα με ερωτήσεις που καλύπτονται από τις ενότητες του forum. Για ο,τι άλλο είμαι εδώ για εσάς.
- follow me @twitter

Άβαταρ μέλους
agrippas
Script Master
Δημοσιεύσεις: 494
Εγγραφή: 18 Ιούλ 2002 14:52
Τοποθεσία: Υπερπέραν
Επικοινωνία:

Μαζική μετατροπή σε UTF-8 (utility)

Δημοσίευση από agrippas » 23 Μαρ 2007 05:09

Hermeia έγραψε:το script το 1ου μηνυματος ειναι φανερα win-only

υπαρχει οτιδήποτε για άλλα συστήματα ?
- βασικα για unix-οειδη ανοιχτου κωδικα,
για macintosh .. γενικά για τους "αόρατους" χρήστες που οι παραθυράδες κάνουν ότι δεν υπάρχουν ..

θενκς
Σε μας είναι πιο απλά τα πράματα:

Κώδικας: Επιλογή όλων

iconv -t utf-8 filename > newfilename
:pint:

billybiros1977
Δημοσιεύσεις: 7
Εγγραφή: 12 Απρ 2007 03:51

Μαζική μετατροπή σε UTF-8 (utility)

Δημοσίευση από billybiros1977 » 19 Απρ 2007 03:33

Auto einai to 1o post meta apo toso kairo pou mpaino kathimerina sto site.
VERY GOOD!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Άβαταρ μέλους
cdhyper
Literature Moderator
Δημοσιεύσεις: 9707
Εγγραφή: 23 Ιουν 2001 03:00
Τοποθεσία: Φωτονερόπετρα
Επικοινωνία:

Μαζική μετατροπή σε UTF-8 (utility)

Δημοσίευση από cdhyper » 19 Απρ 2007 13:54

Εγώ μέχρι σήμερα άνοιγα ένα notepad ++ έβαζα κωδικοποίηση utf-8 και ένα εκεί paste από άλλη πηγή και το έσωζα και ήταν οκ. :) Αλλά σίγουρα μια πιο αυτόματη λύση είναι πάντα καλύτερη.
Σύγκριση τιμών Supermarket: http://www.shopnsave.gr
Νέα Ιταλικα επιπλα κουζινας
Για φιλοσόφους: http://filosofia.gr και http://liantinis.org

Απάντηση

Επιστροφή στο “JavaScript και Frameworks”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες