Capitolo 11. Conversione di dati

Indice

11.1. Strumenti di conversione di dati testuali
11.1.1. Convertire un file di testo con iconv
11.1.2. Controllare se un file è in UTF-8 con iconv
11.1.3. Convertire nomi di file con iconv
11.1.4. Conversione del carattere di fine riga
11.1.5. Conversione di tabulazioni
11.1.6. Editor con auto-conversione
11.1.7. Estrazione del testo puro
11.1.8. Evidenziare e formattare dati in puro testo
11.2. Dati XML
11.2.1. Suggerimenti base per XML
11.2.2. Elaborazione XML
11.2.3. Estrazione di dati XML
11.2.4. Pulizia di dati XML
11.3. Impaginazione
11.3.1. Impaginazione roff
11.3.2. TeX/LaTeX
11.3.3. Fare una bella stampa di una pagina di manuale
11.3.4. Creare una pagina di manuale
11.4. Dati stampabili
11.4.1. Ghostscript
11.4.2. Unire due file PS o PDF
11.4.3. Utilità per dati stampabili
11.4.4. Stampare con CUPS
11.5. Conversione dei dati di posta
11.5.1. Nozioni di base sui dati di posta
11.6. Strumenti per dati grafici
11.7. Conversioni di dati vari

In questo capitolo sono descritti strumenti e trucchi per convertire tra diversi formati di dati in un sistema Debian.

Gli strumenti standard sono eccellenti, ma il supporto per i formati proprietari per i dati è limitato.

Quelli che seguono sono pacchetti per la conversione dei dati testuali che hanno attirato la mia attenzione.


[Suggerimento] Suggerimento

iconv(1) viene fornito come parte del pacchetto libc6 ed è sempre disponibile praticamente su tutti i sistemi in stile Unix, per fare la conversione della codifica dei caratteri.

Si può convertire la codifica di un file di testo con iconv(1) nel modo seguente.

$ iconv -f encoding1 -t encoding2 input.txt >output.txt

Nel trovare corrispondenze con i valori delle codifiche non viene tenuto conto delle lettere maiuscole o minuscole e vengono ignorati i caratteri "-" e "_". Si possono controllare le codifiche supportate con il comando "iconv -l".

Tabella 11.2. Elenco dei valori delle codifiche e loro uso

valore della codifica uso
ASCII American Standard Code for Information Interchange, codifica americana standard per lo scambio di informazioni, codice a 7 bit senza caratteri accentati
UTF-8 attuale standard multilingua per tutti i sistemi operativi moderni
ISO-8859-1 vecchio standard per le lingue europee occidentali, ASCII + caratteri accentati
ISO-8859-2 vecchio standard per le lingue europee orientali, ASCII + caratteri accentati
ISO-8859-15 vecchio standard per le lingue europee occidentali, ISO-8859-1 con simbolo dell'euro
CP850 code page 850, caratteri Microsoft DOS con caratteri grafici per le lingue europee occidentali, variante di ISO-8859-1
CP932 code page 932, variante in stile Microsoft Windows di Shift-JIS per il giapponese
CP936 code page 936, variante in stile Microsoft Windows di GB2312, GBK o GB18030 per il cinese semplificato
CP949 code page 949, variante in stile Microsoft Windows di EUC-KR o Unified Hangul Code per il coreano
CP950 code page 950, variante in stile Microsoft Windows di Big5 per il cinese tradizionale
CP1251 code page 1251, codifica in stile Microsoft Windows per l'alfabeto cirillico
CP1252 code page 1252, variante in stile Microsoft Windows di ISO-8859-15 per le lingue europee occidentali
KOI8-R vecchio standard UNIX russo per l'alfabeto cirillico
ISO-2022-JP codifica standard per la posta elettronica in giapponese che usa solo codici a 7 bit
eucJP vecchio standard UNIX giapponese con codici a 8 bit completamente diverso da Shift-JIS
Shift-JIS standard JIS X 0208 Appendix 1 per il giapponese (vedere CP932)

[Nota] Nota

Alcune codifiche sono gestite solo per la conversione dei dati e non sono utilizzate come valori di localizzazione (Sezione 8.1, «La localizzazione»).

Per i set di caratteri contenuti in un singolo byte, come i set di caratteri ASCII e ISO-8859, la codifica di carattere è quasi la stessa cosa del set di caratteri.

Per i set di caratteri con molti caratteri, come JIS X 0213 per il giapponese o Universal Character Set (UCS, Unicode, ISO-10646-1) per praticamente tutte le lingue, esistono molti schemi di codifica per inserirli nella sequenza dei byte dati.

In questi casi c'è una netta differenza tra il set di caratteri e la codifica di caratteri.

Il termine code page è usato come sinonimo di tabella di codifica dei caratteri per alcune tabelle specifiche di produttori.

[Nota] Nota

Notare che la maggior parte dei sistemi di codifica condividono con ASCII gli stessi codici per i caratteri a 7 bit. Ci sono però alcune eccezioni. Se si stanno convertendo dati di vecchi programmi C o URL in giapponese dal formato di codifica volgarmente chiamato Shift-JIS in formato UTF-8, usare "CP932" come nome di codifica invece di "shift-JIS" per ottenere i risultati attesi: 0x5C → "\" e 0x7E → "~". Altrimenti questi vengono convertiti nei caratteri sbagliati.

[Suggerimento] Suggerimento

Si può anche usare recode(1) che offre più della semplice combinazione delle funzionalità di iconv(1), fromdos(1), todos(1), frommac(1) e tomac(1). Per maggiori informazioni vedere "info recode".

Gli editor moderni intelligenti come il programmavim sono piuttosto bravi e gestiscono bene qualsiasi sistema di codifica e formato di file. Per una migliore compatibilità questi editor andrebbero usati con la localizzazione UTF-8 in console con capacità UTF-8.

Un vecchio file di testo Unix in lingua europea occidentale, "u-file.txt" salvato nella codifica latin1 (iso-8859-1) può essere modificato con vim semplicemente con il comando seguente.

$ vim u-file.txt

Ciò è reso possibile dal fatto che il meccanismo di rivelazione automatica della codifica dei file di vim presuppone come prima cosa che la codifica sia UTF-8 e, se ciò fallisce, presuppone che sia latin1.

Un vecchio file di testo Unix in lingua polacca, "pu-file.txt" salvato nella codifica latin1 (iso-8859-1) può essere modificato con vim con il comando seguente.

$ vim '+e ++enc=latin2 pu-file.txt'

Un vecchio file di testo Unix in giapponese, "ju-file.txt" salvato nella codifica eucJP può essere modificato con vim con il comando seguente.

$ vim '+e ++enc=eucJP ju-file.txt'

Un vecchio file di testo MS-Windows in giapponese, "jw-file.txt" salvato nella cosiddetta codifica shift-JIS (più precisamente CP932) può essere modificato con vim con il comando seguente.

$ vim '+e ++enc=CP932 ++ff=dos jw-file.txt'

Quando un file viene aperto con le opzioni "++enc" e "++ff", l'uso di ":w" nella riga di comando di Vim lo salva nel formato originale sovrascrivendo il file originale. Si può anche specificare nella riga di comando di Vim il formato e il nome con cui salvare il file, ad esempio ":w ++enc=utf8 nuovo.txt".

Fare riferimento a mbyte.txt per il "supporto di testi multi-byte" nell'aiuto in linea di vim e a Tabella 11.2, «Elenco dei valori delle codifiche e loro uso» per i valori delle localizzazione usati con "++enc".

La famiglia di programmi emacs può svolgere funzioni equivalenti.

Il comando seguente legge una pagina web mettendola in un file di testo. È molto utile quando si copiano configurazioni dal Web o per applicare strumenti di testo base Unix come grep(1) sulla pagina web.

$ w3m -dump http://www.remote-site.com/help-info.html >textfile

In modo analogo, si possono estrarre dati in testo puro da altri formati con gli strumenti seguenti.


È possibile evidenziare e formattare dati in testo puro usando gli strumenti seguenti.


XML (Extensible Markup Language) è un linguaggio a marcatori per documenti contenenti informazioni strutturate.

Vedere informazioni introduttive su XML.COM.

I testi XML hanno un aspetto simile all'HTML. Permettono di gestire formati di output multipli per un documento. Un facile sistema per XML è il pacchetto docbook-xsl che è stato usato per questo documento.

Ogni file XML inizia con una dichiarazione XML standard come la seguente.

<?xml version="1.0" encoding="UTF-8"?>

La sintassi di base per un elemento XML usa un marcatore come il seguente.

<name attribute="value">content</name>

Gli elementi XML senza contenuto sono indicati nella seguente forma breve.

<name attribute="value" />

La parte "attributo="valore"" negli esempi precedenti è opzionale.

In XML una sezione di commento è marcata nel modo seguente.

<!-- comment -->

A parte l'aggiunta dei marcatori, XML richiede solo una minima conversione dei contenuti usando entità predefinite per i caratteri seguenti.


[Attenzione] Attenzione

"<" e "&" non possono essere usati in attributi o elementi.

[Nota] Nota

Quando vengono usate entità definite in stile SGML, ad esempio "&qualche-tag;", la prima definizione prevale su tutte le altre. La definizione di entità è espressa nella forma "<!ENTITY qualche-tag "valore entità">".

[Nota] Nota

Fintanto che i marcatori XML sono usati in modo coerente con un certo set dei nomi di tag (qualche dato usato come contenuto o valore di attributo), la conversione in un altro XML è un compito banale usando XSLT (Extensible Stylesheet Language Trasformations.

Sono disponibili molti strumenti per elaborare file XML, come l'XSL (Extensible Stylesheet Language).

Fondamentalmente, una volta creato un file XML ben formato, lo si può convertire in qualsiasi formato usando XSLT (Extensible Stylesheet Language Transformation).

XSL-FO (Extensible Stylesheet Language for Formatting Object), linguaggio per fogli di stile estensibile per la formattazione di oggetti, è pensato per essere una soluzione per la formattazione. Il pacchetto fop è una novità nell'archivio Debian main a causa delle sue dipendenze dal linguaggio di programmazione Java. Perciò il codice LaTeX è solitamente generato dall'XML usando XSLT ed il sistema LaTeX viene usato per creare file adatti alla stampa come DVI, PostScript e PDF.


Dato che XML è un sottoinsieme di SGML (Standard Generalized Markup Language), può essere elaborato dagli strumenti completi disponibili per SGML, come DSSSL (Document Style Semantics and Specification Language).


[Suggerimento] Suggerimento

A volte yelp di GNOME è utile per leggere file XML DocBook direttamente dato che li visualizza in modo decente in X.

Per semplici impaginazioni si può usare il programma Unix troff sviluppato da AT&T. Viene di solito usato per creare pagine man.

TeX, creato da Donald Knuth è uno strumento di impaginazione molto potente ed è lo standard di fatto. LaTeX, scritto originariamente da Leslie Lamport, permette un accesso alla potenza di TeX a più alto livello.


Tradizionalmente il sistema di elaborazione di testi Unix principale è roff. Vedere roff(7), groff(7), groff(1), grotty(1), troff(1), groff_mdoc(7), groff_man(7), groff_ms(7), groff_me(7), groff_mm(7) e "info groff".

Si può leggere o stampare un buon tutorial e documento di consultazione sulla macro "-me" in "/usr/share/doc/groff/", dopo aver installato il pacchetto groff.

[Suggerimento] Suggerimento

"groff -Tascii -me -" produce output in puro testo con codici di escape ANSI. Se si desidera produrre un output in stile pagine man con molti "^H" e "_", usare invece "GROFF_NO_SGR=1 groff -Tascii -me -".

[Suggerimento] Suggerimento

Per rimuovere i "^H" e "_" da un file di testo generato con groff, filtrarlo con "col -b -x".

La distribuzione software TeX Live offre un sistema TeX completo. Il metapacchetto texlive fornisce una buona selezione dei pacchetti TeX Live che dovrebbe essere sufficiente per la maggior parte dei compiti più comuni.

Ci sono molti documenti consultabili disponibili per TeX e LaTeX.

  • teTeX HOWTO: The Linux-teTeX Local Guide

  • tex(1)

  • latex(1)

  • texdoc(1)

  • texdoctk(1)

  • "The TeXbook", di Donald E. Knuth, (Addison-Wesley)

  • "LaTeX - A Document Preparation System", di Leslie Lamport, (Addison-Wesley)

  • "The LaTeX Companion", di Goossens, Mittelbach, Samarin, (Addison-Wesley)

Questo è l'ambiente di impaginazione più potente. Molti elaboratori SGML lo usano come backend per l'elaborazione del testo. Lyx, fornito dal pacchetto lyx, e GNUTeXmacs, fornito dal pacchetto texmacs, offrono un bell'ambiente WYSIWYG per LaTeX; inoltre molti usano Emacs e Vim come scelta di editor per i sorgenti.

Sono disponibili molte risorse in rete.

Quando i documenti crescono di dimensioni, a volte TeX può generare errori. Per risolvere queto problema si deve aumentare la dimensione di pool in "/etc/texmf/texmf.cnf" (o in modo più corretto, modificare "/etc/texmf/texmf.d/95NonPath" ed eseguire update-texmf(8)).

[Nota] Nota

Il sorgente TeX di "The TeXbook" è disponibile all'indirizzo http://tug.ctan.org/tex-archive/systems/knuth/dist/tex/texbook.tex. Questo file contiene la maggior parte delle macro necessarie. Mi è stato detto che si può elaborare questo documento con tex(1) dopo aver commentato le righe da 7 a 10 ed aggiungendo "\input manmac \proofmodefalse". È caldamente raccomandabile comprare questo libro (e tutti gli altri libri di Donald E. Knuth) invece di usare le versioni in rete, ma il sorgente è un meraviglioso esempio di input TeX!

In un sistema Debian i dati stampabili sono presentati in formato PostScript. CUPS (Common Unix Printing System) usa Ghostscript come suo programma backend per la rasterizzazione per le stampanti non-PostScript.

È possibile unire due file PostScript (PS) o PDF (Portable Document Format) usando gs(1) di Ghostscript.

$ gs -q -dNOPAUSE -dBATCH -sDEVICE=pswrite -sOutputFile=bla.ps -f foo1.ps foo2.ps
$ gs -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=bla.pdf -f foo1.pdf foo2.pdf
[Nota] Nota

Il formato PDF che è un formato ampiamente usato per dati stampabili multipiattaforma, è essenzialmente il formato PS compresso con alcune funzionalità ed estensioni aggiuntive.

[Suggerimento] Suggerimento

Per manipolare dalla riga di comando documenti PostScript sono utili psmerge(1) e altri comandi nel pacchetto psutils. Anche pdftk(1), nel pacchetto pdftk, è utile per manipolare documenti PDF.

Quello che segue è un elenco di pacchetti con utilità per dati stampabili che hanno attirato la mia attenzione.


Entrambi i comandi lp(1) e lpr(1) forniti da CUPS (Common Unix Printing System) forniscono opzioni per stampe personalizzate dei dati stampabili.

Si possono stampare 3 copie fascicolate di un file usando uno dei comandi seguenti.

$ lp -n 3 -o Collate=True filename
$ lpr -#3 -o Collate=True filename

Si può personalizzare ulteriormente l'operazione di stampa usando opzioni come "-o number-up=2", "-o page-set=even", "-o page-set=odd", "-o scaling=200", "-o natural-scaling=200", ecc., documentate in Stampa dalla riga di comando ed opzioni relative.

Quelli che seguono sono pacchetti per la conversione dei dati di posta che hanno attirato la mia attenzione.


[Suggerimento] Suggerimento

Se il software del programma di posta può essere configurato per usarlo, anche il server IMAP4 (Internet Message Access Protocol, versione 4) può essere usato per spostare la posta da sistemi proprietari.

I dati di posta (SMTP) dovrebbero essere limitati a serie di 7 bit di dati. Perciò dati binari e testi a 8 bit sono codificati in un formato a 7 bit con MIME (Multipurpose Internet Mail Extensions) e la selezione del set di caratteri (vedere Tabella 11.2, «Elenco dei valori delle codifiche e loro uso»).

Il formato standard per l'archiviazione della posta è mbox strutturato seguendo la RFC2822 (che aggiorna RFC822). Vedere mbox(5) (fornito dal pacchetto mutt).

Per le lingue europee, per la posta viene di solito usato "Content-Transfer-Encoding: quoted-printable" con il set di caratteri ISO-8859-1 dato che non ci sono molti caratteri a 8 bit. Se il testo europeo è codificato in UTF-8, è probabile venga usato "Content-Transfer-Encoding: quoted-printable" dato che sono per la maggior parte dati a 7 bit.

Per il giapponese, per la posta viene tradizionalmente usato "Content-Type: text/plain; charset=ISO-2022-JP" per mantenere il testo a 7 bit. Ma sistemi Microsoft più vecchi possono inviare dati di posta in Shift-JIS senza una dichiarazione appropriata. Se il testo giapponese è codificato in UTF-8, è probabile venga usato Base64 dato che contiene molti dati a 8 bit. La situazione delle altre lingue asiatiche è simile.

[Nota] Nota

Se i dati di posta non-Unix sono accessibili da un software di posta non-Debian che può comunicare con il server IMAP4, potrebbe essere possibile spostarli eseguendo un proprio server IMAP4.

[Nota] Nota

Se si usano altri formati di archiviazione, spostarli nel formato mbox è un buon primo passo. Un versatile programma client come mutt(1) può essere di aiuto in questo caso.

Si può suddividere il contenuto di una casella di posta nei singoli messaggi usando procmail(1) e formail(1).

Ciascun messaggio di posta può essere spachettato usando munpack(1), dal pacchetto mpack, (o con altri strumenti specializzati) per ottenere i contenuti codificati MIME.

Quelli che seguono sono pacchetti per la conversione, la modifica e l'organizzazione di dati grafici che hanno attirato la mia attenzione.

Tabella 11.17. Elenco di strumenti per dati grafici

pacchetto popcon dimensione parola chiave descrizione
gimp V:53, I:272 19767 immagine(bitmap) GNU Image Manipulation Program, programma GNU di manipolazione di immagini
imagemagick I:326 176 immagine(bitmap) programmi di manipolazione immagini
graphicsmagick V:2, I:15 5445 immagine(bitmap) programmi di manipolazione di immagini (fork di imagemagick)
xsane V:13, I:148 2339 immagine(bitmap) frontend X11 basato su GTK per SANE (Scanner Access Now Easy)
netpbm V:24, I:336 8200 immagine(bitmap) strumenti di conversione di dati grafici
icoutils V:9, I:65 221 png↔ico(bitmap) converte icone e puntatori MS Windows da e verso il formato PNG (favicon.ico)
scribus V:1, I:20 30234 ps/pdf/SVG/… editor DTP Scribus
libreoffice-draw V:84, I:408 13442 immagine(vettoriale) suite per ufficio LibreOffice - disegno
inkscape V:17, I:147 99316 immagine(vettoriale) editor SVG (Scalable Vector Graphics)
dia V:2, I:25 3908 immagine(vettoriale) editor di diagrammi (Gtk)
xfig V:0, I:13 7798 immagine(vettoriale) strumento per la generazione interattiva di figure in X11
pstoedit V:2, I:64 1005 ps/pdf→immagine(vettoriale) convertitore di file PostScript e PDF in grafica vettoriale modificabile (SVG)
libwmf-bin V:7, I:155 180 Windows/immagine(vettoriale) strumenti di conversione di metafile windows (dati di grafica vettoriale)
fig2sxd V:0, I:0 151 fig→sxd(vettoriale) converte file XFig nel formato di Draw di OpenOffice.org
unpaper V:2, I:18 412 immagine→immagine strumento di post-elaborazione per pagine scansionate per OCR
tesseract-ocr V:7, I:36 2135 immagine→testo software OCR libero basato sul motore OCR commerciale di HP
tesseract-ocr-eng V:8, I:36 4032 immagine→testo dati per motore OCR: file di lingua tesseract-ocr per testi in inglese
gocr V:1, I:9 545 immagine→testo software OCR libero
ocrad V:0, I:4 578 immagine→testo software OCR libero
eog V:57, I:259 7836 immagine(Exif) visualizzatore di immagini grafiche Eye of GNOME
gthumb V:4, I:18 5395 immagine(Exif) navigatore e visualizzatore di immagini (GNOME)
geeqie V:5, I:17 15398 immagine(Exif) visualizzatore d'immagini che usa GTK
shotwell V:15, I:233 6548 immagine(Exif) organizzatore di foto digitali (GNOME)
gtkam V:0, I:5 1154 immagine(Exif) applicazione per recuperare dati multimediali da fotocamere digitali (GTK)
gphoto2 V:0, I:10 947 immagine(Exif) client gphoto2 a riga di comando per le fotocamere digitali
gwenview V:26, I:90 11604 immagine(Exif) visualizzatore di immagini (KDE)
kamera I:89 983 immagine(Exif) supporto per fotocamere digitali in applicazioni KDE
digikam V:2, I:11 265 immagine(Exif) applicazione per la gestione delle foto digitali per KDE
exiv2 V:2, I:32 278 immagine(Exif) strumento di manipolazione di metadati EXIF/IPTC
exiftran V:1, I:17 70 immagine(Exif) trasforma immagini JPEG di fotocamere digitali
jhead V:0, I:9 131 immagine(Exif) manipola la parte non-immagine di file JPEG (fotografie digitali) aderenti conformi ad Exif
exif V:1, I:16 339 immagine(Exif) utilità a riga di comando per mostrare informazioni EXIF in file JPEG
exiftags V:0, I:4 292 immagine(Exif) utilità per leggere i tag EXIF da un file JPEG di una fotocamera digitale
exifprobe V:0, I:3 499 immagine(Exif) legge metadati da immagini digitali
dcraw V:1, I:14 583 immagine(Raw)→ppm decodifica immagini raw di fotocamere digitali
findimagedupes V:0, I:1 76 immagine→fingerprint trova immagini simili visivamente o duplicati
ale V:0, I:0 839 immagine→immagine fonde immagini per migliorarne la fedeltà o creare mosaici
imageindex V:0, I:1 145 immagine(Exif)→html genera gallerie HTML statiche da immagini
outguess V:0, I:1 230 jpeg,png strumento steganografico universale
librecad V:1, I:16 8798 DXF editor di dati CAD (KDE)
blender V:2, I:32 87149 blend, TIFF, VRML, … editor di contenuti 3D per animazioni, ecc.
mm3d V:0, I:0 3868 ms3d, obj, dxf, … editor di modelli 3D basato su OpenGL
open-font-design-toolkit I:0 10 ttf, ps, … metapacchetto per creazione di tipi di caratteri open
fontforge V:0, I:7 3980 ttf, ps, … editor di tipi di carattere per caratteri PS, TrueType e OpenType
xgridfit V:0, I:0 806 ttf programma per gridfitting e hinting di tipi di carattere TrueType

[Suggerimento] Suggerimento

Cercare ulteriori strumenti per le immagini usando l'espressione regolare "~Gworks-with::image" in aptitude(8) (vedere Sezione 2.2.6, «Opzioni per i metodi di ricerca in aptitude»).

Sebbene programmi con interfaccia utente grafica come gimp(1) siano molto potenti, strumenti a riga di comando come imagemagick(1) sono piuttosto utili per manipolare in modo automatico immagini usando script.

Il formato standard di fatto per i file immagini delle fotocamere digitali è EXIF (Exchangeable Image File Format) che è il formato per file immagine JPEG con tag aggiuntivi con metadati. Può contenere informazioni come la data, l'orario e le impostazioni della fotocamera.

I diritti sulla compressione senza perdita di dati Lempel-Ziv-Welch (LZW) sono scaduti. Le utilità GIF (Graphics Interchange Format) che usano il metodo di compressione LZW sono ora disponibili liberamente sul sistema Debian.

[Suggerimento] Suggerimento

Qualsiasi fotocamera digitale o scanner con un supporto di archiviazione removibile funziona in Linux attraverso i lettori di archiviazione USB dato che segue le regole progettuali per i file system delle fotocamere e usa il file system FAT. Vedere Sezione 10.1.7, «Supporti di archiviazione removibili».

Ci sono molti altri programmi per convertire dati. I pacchetti seguenti, trovati usando l'espressione regolare "~Guse::converting" in aptitude(8) (vedere Sezione 2.2.6, «Opzioni per i metodi di ricerca in aptitude»), hanno catturato la mia attenzione.


Si possono estrarre i dati dal formato RPM anche nel modo seguente.

$ rpm2cpio file.src.rpm | cpio --extract