第 11 章 資料轉換

目录

11.1. 文字資料轉換工具
11.1.1. 用 iconv 命令來轉換文字檔案
11.1.2. 用 iconv 檢查檔案是不是 UTF-8 編碼
11.1.3. 使用 iconv 轉換檔名
11.1.4. 換行符轉換
11.1.5. TAB 轉換
11.1.6. 帶有自動轉換功能的編輯器
11.1.7. 提取純文字
11.1.8. 高亮並格式化純文字資料
11.2. XML 資料
11.2.1. XML 的基本提示
11.2.2. XML 處理
11.2.3. XML 資料提取
11.3. 排版
11.3.1. roff 排版
11.3.2. TeX/LaTeX
11.3.3. 漂亮的列印手冊頁
11.3.4. 建立手冊頁
11.4. 可印刷的資料
11.4.1. Ghostscript
11.4.2. 合併兩個 PS 或 PDF 檔案
11.4.3. 處理可印刷資料的工具
11.4.4. 用 CUPS 列印
11.5. 郵件資料轉換
11.5.1. 郵件資料基礎
11.6. 圖形資料工具
11.7. 不同種類的資料轉換工具

下面是關於Debian 系統上可用的格式轉化工具及其相關提示的資訊。

基於標準的工具,是非常好用的,但支援的專有資料格式有限.

如下是文字資料轉換工具。


[提示] 提示

iconv(1)libc6 軟體包的一部分並且它可以在類 Unix 的系統上轉換字元的編碼。

你能夠通過如下的命令用 iconv(1) 來轉換文字檔案的編碼。

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

編碼值是大小寫不敏感的,且會在匹配時忽略“-”和“_”。可以使用“iconv -l”命令檢查支援的編碼。


[注意] 注意

一些編碼只支援資料轉換,它不能作為語言環境的值 (第 8.4.1 节 “編碼的基礎知識”)。

ASCIIISO-8859 這樣適用於單位元組的字符集,字元編碼和字符集幾乎指的是同一件事情。

對於多字元的字符集,比如說,用於日文的 JIS X 0213,或用於差不多所有語言的 Universal Character Set (UCS, Unicode, ISO-10646-1) , 有多種編碼方案來序列化它們的位元組資料。

對於以上這些,字符集和字元編碼之間有著明顯的區別。

對某些計算機廠家而言,code page 是作為字元編碼表的同義詞來使用。

[注意] 注意

請注意,大部分編碼系統共享 ASCII 的 7 位字元的同樣編碼,但也有一些列外。如果你從通常所說的 shift-JIS 編碼格式,轉化老的日文 C 語言程式和 URL 資料,到 UTF-8 格式,你需要使用 "CP932" 作為編碼名來代替 "shift-JIS" 來得到期望的結果: 0x5C → "\" 和 0x7E → "~".否則,這些將被轉化為錯誤的字元。

[提示] 提示

recode(1) 也可能被使用並且不僅僅是 iconv(1)fromdos(1)todos(1)frommac(1)tomac(1) 功能的結合。想要獲得更多資訊,請參見 "info recode"。

vim 這樣的現代智慧編輯器軟體是相當聰明的並且能夠處理任何編碼系統以及任何檔案格式。你應該在支援 UTF-8 編碼的控制檯上並在 UTF-8 環境下使用這些編輯器來獲得最好的相容性。

以 latin1(iso-8859-1)編碼儲存的舊西歐語言的 Unix 文字檔案,“u-file.txt”,能通過如下所示的用 vim 輕易的編輯。

$ vim u-file.txt

這是可能的因為 vim 的檔案編碼自動檢測機制先假定檔案是 UTF-8 編碼,如果失敗了,則假定它是 latin1 編碼。

以 latin2(iso-8859-2) 編碼儲存的舊波蘭語的 Unix 文字檔案,“pu-file.txt”,能通過如下所示的用 vim 編輯。

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

以 eucJP 編碼儲存的舊日語的 Unix 文字檔案,"ju-file.txt",能通過如下所示的用 vim 編輯。

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

以所謂的 shift-JIS 編碼 (更確切的說法是:CP932) 儲存的舊日語 MS-Windows 文字檔案,"jw-file.txt",能通過如下所示的用 vim 編輯。

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

當一個檔案用 vim 開啟的時候帶有 "++enc" 和 "++ff" 選項,在 Vim 命令列輸入 ":w" 命令會以原格式儲存檔案並且會覆蓋原檔案。你也可以在 Vim 命令列指定儲存檔名及其格式,例如,":w ++enc=utf8 new.txt"。

請查閱 vim 線上幫助中的 mbyte.txt,"多位元組文字支援"和表 11.2 “編碼值和用法的列表”來獲得 "++enc" 使用的本地值的資訊。

emacs 家族的程式能夠實現同樣的功能。

你可以通過如下所示的來高亮並格式化純文字資料。

表 11.6. 高亮純文字資料的工具列表

軟件包 流行度 大小 關鍵詞 說明
vim-runtime V:21, I:432 28018 高亮 用 ":source $VIMRUNTIME/syntax/html.vim" Vim 巨集命令轉化原始碼到 HTML
cxref V:0, I:0 1174 c→html 從 C 程式到 latex 和 HTML 的轉換器(C語言)
src2tex V:0, I:0 622 高亮 轉換許多原始碼到 TeX(C語言)
source-highlight V:0, I:7 2008 高亮 轉換原始碼到帶有高亮顯示的 HTML, XHTML, LaTeX, Texinfo, ANSI 顏色轉義序列和 DocBook 檔案 (C++)
highlight V:1, I:16 1054 高亮 轉化許多原始碼到帶有高亮顯示的 HTML, XHTML, RTF, LaTeX, TeX or XSL-FO 檔案。(C++)
grc V:0, I:2 106 text→有顏色的 用於任何文字的通用顏色生成器 (Python)
txt2html V:0, I:4 296 text→html 文字到 HTML 轉換器(Perl)
markdown V:0, I:7 56 text→html markdown 文字文件到 (X)HTML (Perl)
asciidoc I:14 63 text→any AsciiDoc 文字文件到 XML/HTML (Python)
pandoc V:3, I:30 50298 text→any 通用標記轉化器 (Haskell)
python-docutils V:42, I:423 1725 text→any 重構文字文件到 XML (Python)
txt2tags V:0, I:1 951 text→any 轉化文字到 HTML, SGML, LaTeX, man page, MoinMoin, Magic Point and PageMaker (Python)
udo V:0, I:0 569 text→any 通用的文字檔案轉化工具 (C 語言)
stx2any V:0, I:0 264 text→any 結構化純文字到其他格式的文件轉化器 (m4)
rest2web V:0, I:0 526 text→html 重構文字到 html 的文件轉化器 (Python)
aft V:0, I:0 235 text→any "自由格式"的檔案準備系統 (Perl)
yodl V:0, I:0 554 text→any 用預文件語言工具來處理檔案 (C 語言)
sdf V:0, I:0 1445 text→any 簡單的文件剖析器 (Perl)
sisu V:0, I:0 5341 text→any 文件組織、排版、搜尋框架 (Ruby)

擴充套件標記語言 Extensible Markup Language (XML) 是一種標記語言,用於含有結構化資訊的文件。

XML.COM 檢視介紹資訊.

XML 文字看起來有些像 HTML.它能夠使我們管理一個文件的多個格式。一個簡單的 XML 系統是 docbook-xsl 軟體包,在這裡使用。

每一個 XML 檔案使用下面的標準 XML 宣告開始。

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

XML 元素的基本語法是按下面的方式標記。

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

內容為空的 XML 元素,使用下面的短格式標記。

<name attribute="value"/>

上面列子中的 "attribute="value"" 是可選的。

XML 裡面的註釋部分,是按下面的方式標記。

<!-- comment -->

不同於增加標記,XML 至少要求使用預定義實體裡的內容來轉化下列字元。


[小心] 小心

<”或“&”不能在屬性(attributes)或元素(elements)中使用。

[注意] 注意

當 SGML 式樣的使用者定義實體,比如 "&some-tag:", 被使用的時候,第一個定義會覆蓋其它的。實體定義在 "<!ENTITY some-tag "entity value">"裡表示.

[注意] 注意

只要 XML 標記是一致使用某一標籤名集合(一些資料作為內容或屬性值),使用 Extensible Stylesheet Language Transformations (XSLT) 來轉換到另外一個 XML,是一個微不足道的任務。

有許多工具可以用於處理 XML 檔案,比如說: 可擴充套件樣式表語言 Extensible Stylesheet Language (XSL).

一旦你建立了一個好的成形的 XML 檔案,基本上來講,你就可以使用 可擴充套件樣式表語言轉換 Extensible Stylesheet Language Transformations (XSLT),將其轉換成任何格式。

格式化物件的可擴充套件樣式表語言 Extensible Stylesheet Language for Formatting Objects (XSL-FO) 是用來作為格式化的解決方案. fop 軟體包比 Debian main 檔案庫要新,因為它依賴 Java 程式語言. LaTeX 程式碼通常是從 XML 使用 XSLT 生成,LaTeX 系統是用來建立 DVI, PostScript 和 PDF 這類可列印的檔案。


由於 XML 是 標準通用標記語言 Standard Generalized Markup Language (SGML)的一個子集,用於處理 SGML 的擴充套件工具,也能夠處理 XML,比如說 文件式樣語言和規範語言 Document Style Semantics and Specification Language (DSSSL).


[提示] 提示

GNOMEyelp 往往能夠方便的直接讀取 DocBook XML 檔案,這是因為它可以從 X 獲得適當的渲染。

Unix上的 troff 程式最初是由 AT&T 公司開發的,可以被用做簡單排版。現在被用來建立手冊頁。

Donald Knuth 發明的 Tex 是非常強大的排版工具也是實際上的標準。最初是由 Leslie Lamport 開發的 LaTex 使得使用者可以更為方便的利用 Tex 的強大功能。


傳統意義上,roff 是 Unix 上主要的文字處理系統。參見 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) 和 "info groff"。

安裝好 groff 軟體包以後,你輸入 "-me" 巨集指令就能看到一份不錯的指導手冊,它的位置是 "/usr/share/doc/groff/"。

[提示] 提示

"groff -Tascii -me -" 輸出帶有 ANSI 轉義碼的純文字。如果你想要 manpage 的輸出帶有許多 "^H" 和 "_",那麼使用替代命令 "GROFF_NO_SGR=1 groff -Tascii -me -"。

[提示] 提示

如果想要移除 groff 生成的文字檔案中的 "^H" 和 "_",使用 "col -b -x" 來過濾它。

Tex Live 軟體提供了全部的 TeX 系統。texlive 元包只是 TeX Live 中的一部分,但是它足夠應付日常任務。

這裡有許多可用的 TeXLaTeX 的參考資料。

  • The teTeX HOWTO: The Linux-teTeX Local Guide

  • tex(1)

  • latex(1)

  • texdoc(1)

  • texdoctk(1)

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

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

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

這是最強大的排版環境。許多 SGML 處理器把它作為其後臺字處理工具。lyx 軟體包提供的 Lyxtexmacs 軟體包提供的 GNU TeXmacs 都為 LaTeX 提供了非常不錯的所見即所得的編輯環境,然而許多人使用 EmacsVim 作為其原始碼編輯器。

有許多線上資源存在。

當文件變得更大時,TeX 有時會出錯。你必須在 "/etc/texmf/texmf.cnf" 中增加 pool 的大小 (更確切的說話是編輯是 "/etc/texmf/texmf.d/95NonPath" 並且執行 update-texmf(8)) 來修復此問題。

[注意] 注意

"The TeXbook" 的 TeX 原始碼可以從 http://tug.ctan.org/tex-archive/systems/knuth/dist/tex/texbook.tex 上下載。此檔案包含了絕大多數所需的巨集指令。我聽說把文件中的第7到第10行註釋了並且新增 "\input manmac \proofmodefalse",就可以用 tex(1) 來處理此文件。我強烈建議去購買這本書 (還有 Donald E. Knuth 寫的其他書) 而不是使用線上版本,但是線上版本中的原始碼確實是學習 Tex 輸入很好的例子!

在 Debian 系統中,可列印的資料是 PostScript 格式的。對於非 PostScript 印表機,通用 Unix 列印系統 (CUPS) 使用 Ghostscript 作為其後臺光柵處理程式。

你能夠使用 Ghostscript 中的 gs(1) 來合併兩個 PostScript(PS)可移植文件格式(PDF) 檔案。

$ 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
[注意] 注意

PDF 是用途很廣的跨平臺可印刷的資料格式,它本質上是帶有一些額外特性和擴充套件的壓縮了的 PS 格式。

[提示] 提示

對於命令列來說,psmerge(1)psutils 包中的其他命令在處理 PostScript 文件時是很有用的。pdftk 包中的 pdftk(1) 在處理 PDF 文件的時候同樣是很好用的。

如下是處理可印刷資料的工具列表。


Unix 通用列印系統(CUPS) 中的 lp(1)lpr(1) 命令都提供了自定義列印資料的選項。

你可以使用下列命令中的一個來列印 3 份有裝訂頁碼的檔案。

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

你能夠通過 "-o number-up=2", "-o page-set=even", "-o page-set=odd", "-o scaling=200", "-o natural-scaling=200" 等等印表機選項來進一步定製印表機操作,詳細的文件參見命令列列印和選項

下列郵件資料轉換軟體包捕獲了我的眼球。


[提示] 提示

如果郵件客戶端可以配置使用 IMAP4 伺服器,網際網路訊息訪問協議 版本 4 (IMAP4) 伺服器 (參見 第 6.7 节 “POP3/IMAP4 伺服器”) 可以用來把郵件從專有郵件系統裡面移出來。

郵件 (SMTP) 資料需要被限制為 7 位資料序列。二進位制資料和 8 位文字資料使用 Multipurpose Internet Mail Extensions (MIME) 網際網路多用途郵件擴充套件 和選擇的字符集編碼到 7 位格式。(參見 第 8.4.1 节 “編碼的基礎知識”).

標準的郵件儲存格式是 mbox,它是依據 RFC2822 (由 RFC822 更新) 來的格式. 參見 mbox(5) (由 mutt 軟體包提供).

對於歐洲語言,由於沒有什麼 8 位字元,"Content-Transfer-Encoding: quoted-printable" 加 ISO-8859-1 字符集通常被用於郵件。如果歐洲文字是被編碼為 UTF-8,由於幾乎全是 7 位資料,使用 "Content-Transfer-Encoding: quoted-printable" 也是合適的。

對於日語,傳統的 "Content-Type: text/plain; charset=ISO-2022-JP" 通常被用於郵件來保持文字在 7 位。但是老的微軟系統會在沒有宣告的情況下使用 Shift-JIS 來發送郵件。如果日語文字是用 UTF-8 編碼, 由於含有許多 8 位資料,使用 Base64 是合適的。其它亞洲語言也是類似情形。

[注意] 注意

如果你的非 Unix 郵件資料可以通過一個具備和 IMAP4 服務通訊的非 Debian 客戶端訪問,你可以通過執行你的 IMAP4 服務來將郵件資料移出。(參見 第 6.7 节 “POP3/IMAP4 伺服器”).

[注意] 注意

如果你使用其它郵件儲存格式,第一步把它們移動到 mbox 格式比較好。像 mutt(1) 這樣多功能的客戶端程式可以便捷的完成這類操作。

你可以使用 procmail(1)formail(1) 把郵箱內容分開成每一封郵件.

每一封郵件能夠使用來自 mpack 軟體包的 munpack(1) 命令(或其它特異的工具)來獲得 MIME 編碼內容。

如下是關於圖形資料轉換、編輯和管理的工具包。

表 11.17. 圖形資料工具列表

軟件包 流行度 大小 關鍵詞 說明
gimp V:87, I:505 16278 圖形(點陣圖) GNU 圖形處理程式
imagemagick V:87, I:552 196 圖形(點陣圖) 圖形處理程式
graphicsmagick V:6, I:15 4903 圖形(點陣圖) 影象處理程式(imagemagick派生出來的)
xsane V:21, I:192 909 圖形(點陣圖) 用於 SANE 的基於 GTK+ 的前端圖形介面 (現在訪問掃描器就很簡單了)
netpbm V:29, I:555 4302 圖形(點陣圖) 圖形介面的轉換工具
icoutils V:10, I:119 194 png↔ico(bitmap) MS Windows 符號和游標轉化為 PNG 格式,或者從 PNG 格式轉化為點陣圖格式 (favicon.ico)
scribus V:8, I:27 19061 ps/pdf/SVG/… Scribus DTP 編輯器
libreoffice-draw V:337, I:480 9758 圖形(向量) LibreOffice 辦公套件-繪畫
inkscape V:138, I:348 129795 圖形(向量) SVG(可升級向量圖形)編輯器
dia-gnome V:2, I:9 21 圖形(向量) 圖表編輯器(GNOME)
dia V:23, I:39 3886 圖形(向量) 圖表編輯器(Gtk)
xfig V:12, I:18 1795 圖形(向量) 在圖形介面下,互動式的生成影象變得方便
pstoedit V:9, I:262 666 ps/pdf→image(向量) PostScript 和 PDF 檔案到可編輯的向量圖形的轉換器(SVG)
libwmf-bin V:13, I:355 104 Windows/image(向量) Windows 元檔案 (向量圖形資料) 轉換工具
fig2sxd V:0, I:0 149 fig→sxd(向量) 轉換 XFig 檔案為 OpenOffice.org 繪畫格式
unpaper V:2, I:16 453 image→image 後處理 OCR 掃描頁面的工具
tesseract-ocr V:4, I:28 558 image→text 基於惠普的商業 OCR 引擎的免費 OCR 軟體
tesseract-ocr-eng I:29 37486 image→text OCR 引擎資料:用於英文文字的 tesseract-ocr 語言檔案
gocr V:1, I:21 477 image→text 免費 OCR 軟體
ocrad V:1, I:7 299 image→text 免費 OCR 軟體
eog V:89, I:322 10780 影象(Exif) Eye of GNOME 影象瀏覽程式
gthumb V:15, I:26 3369 影象(Exif) 影象瀏覽器(GNOME)
geeqie V:15, I:23 1588 影象(Exif) 基於 GTK+ 的影象瀏覽器
shotwell V:19, I:179 5763 影象(Exif) 數碼相片管理器(GNOME)
gtkam V:0, I:7 1151 影象(Exif) 從數碼照相機中檢索多媒體資料的應用 (GTK+)
gphoto2 V:1, I:14 969 影象(Exif) gphoto2 軟體是命令列方式的管理數碼相機的工具
gwenview V:32, I:104 4509 影象(Exif) 圖片瀏覽器(KDE)
kamera I:104 230 影象(Exif) KDE 上的支援數碼相機的應用軟體
digikam V:3, I:16 1760 影象(Exif) 用於 KDE 桌面環境的數字照片管理應用
exiv2 V:4, I:66 246 影象(Exif) EXIF/IPTC 元資料處理工具
exiftran V:1, I:25 71 影象(Exif) 改變數碼照相機的 jpeg 影象格式
jhead V:1, I:12 105 影象(Exif) 處理相容 JPEG 檔案 (數碼相機圖片) 的 Exif 中的非圖形部分
exif V:1, I:11 236 影象(Exif) 顯示 JPEG 檔案中的 EXIF 資訊的命令列工具
exiftags V:0, I:4 288 影象(Exif) 從數碼相機的 JPEG 檔案讀取 Exif 標籤的實用工具
exifprobe V:0, I:3 490 影象(Exif) 從數碼圖片中讀取元資料
dcraw V:3, I:24 384 image(原始的)→ppm 解碼原始的數碼相機圖片
findimagedupes V:0, I:1 79 image→fingerprint 找到相似或重複的影象
ale V:0, I:0 753 image→image 合併影象來增加保真度或者用於建立馬賽克
imageindex V:0, I:0 144 image(Exif)→html 從圖形中建立靜態 HTML 相簿
outguess V:0, I:1 216 jpeg,png 通用的 Steganographic 工具
librecad V:10, I:17 8039 DXF CAD 資料編輯器(KDE)
blender V:4, I:30 101389 blend, TIFF, VRML, … 用於動畫的 3D 編輯器
mm3d V:0, I:0 5314 ms3d, obj, dxf, … 基於 OpenGL 的 3D 模型編輯器
open-font-design-toolkit I:0 11 ttf, ps, … 用於開放字型設計的元包
fontforge V:0, I:9 91 ttf, ps, … 用於 PS,TrueType 和 OpenType 的字型編輯器
xgridfit V:0, I:0 876 ttf 用於TrueType 字型的 網格擬合和小字還原技術 的程式

[提示] 提示

aptitude(8) (參考第 2.2.6 节 “aptitude 搜尋方式選項”)中用正則表示式 "~Gworks-with::image" 來查詢更多的影象工具。

雖然像 gimp(1) 這樣的圖形介面程式是非常強大的,但像 imagemagick(1) 這樣的命令列工具在用指令碼自動化處理影象時是很有用的。

實際上的數碼相機的影象是可交換的影象檔案格式(EXIF),這種格式是在 JPEG 影象檔案格式上新增一些元資料標籤。它能夠儲存諸如日期、時間和相機設定的資訊。

The Lempel-Ziv-Welch (LZW)無損資料壓縮專利已經過期了。使用 LZW 壓縮方式的 圖形互動格式(GIF)工具現在可以在 Debian 系統上自由使用了。

[提示] 提示

任何帶有可移動記錄介質的數碼相機或掃描器都可以在 Linux 上通過 USB 儲存讀取器來工作,因為它遵循相機檔案系統設計規則並且使用 FAT 檔案系統,參考第 10.1.7 节 “可移動儲存裝置”

這裡有許多其他用於資料轉換的工具。在 aptitude(8)(參考 第 2.2.6 节 “aptitude 搜尋方式選項”) 裡用正則表示式 "~Guse::converting"" 來查詢如下的軟體包。


你能夠通過如下的命令從 RPM 格式的包中提取資料。

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