章 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.2.4. 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.6.1. 圖形資料工具(元軟體包)
11.6.2. 圖形資料工具(GUI 圖形使用者介面)
11.6.3. 圖形資料工具 (CLI 命令列)
11.7. 不同種類的資料轉換工具

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

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

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


[提示] 提示

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

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

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

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


[注意] 注意

一些編碼只支援資料轉換,它不能作為語言環境的值 (節 8.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 家族的程式能夠實現同樣的功能。

擴展標記語言 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 生成,LaTe圖形化界面是用來建立 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 軟體提供了全部的 Te圖形化界面。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 原始碼可以從 texbook.tex 的 www.ctan.org tex-archive 站點上下載。此檔案包含了絕大多數所需的宏指令。我聽說把文件中的第7到第10行註釋了並且新增 "\input manmac \proofmodefalse",就可以用 tex(1) 來處理此文件。我強烈建議去購買這本書 (還有 Donald E. Knuth 寫的其他書) 而不是使用線上版本,但是線上版本中的原始碼確實是學習 Tex 輸入很好的例子!

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

在最近的 Debian 系統中,可印刷的資料,也可以用 PDF 格式表示。

PDF 檔案能夠使用 GUI(圖形使用者介面)的檢視工具顯示,它的排版條目也可以被填充到 GUI(圖形使用者介面)檢視工具,比如 EvinceOkular (參見 節 7.4, “GUI(圖形使用者介面)應用”); 以及現代瀏覽器,比如 Chromium

PDF 檔案能夠使用某些影像工具編輯,比如 LibreOfficeScribusInkscape (參見 節 11.6, “圖形資料工具”)。

[提示] 提示

你能夠用 GIMP 閱讀 PDF 檔案,並能夠用高於 300 dpi 畫素的解析度,將 PDF 轉換為 PNG 格式。這個可以作為 LibreOffice 背景圖片,用最簡單的操作生成一個期望的替代列印輸出。

你能夠使用 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) 伺服器可以用來把郵件從專有郵件系統裡面移出來。

郵件 (SMTP) 資料需要被限制為 7 位資料序列。二進位制資料和 8 位文字資料使用 Multipurpose Internet Mail Extensions (MIME) 網際網路多用途郵件擴充套件 和選擇的字元集編碼到 7 位格式。(參見 表格 11.2, “編碼值和用法的列表”)。

標準的郵件儲存格式是 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 服務來將郵件資料移出。

[注意] 注意

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

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

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

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

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

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

[提示] 提示

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

下列 GUI(圖形使用者介面)的圖形資料轉換、編輯和管理工具的軟體包捕獲了我的眼球。

表格 11.18. 圖形資料工具(GUI 圖形使用者介面)列表

軟體包 流行度 大小 關鍵詞 說明
gimp V:50, I:252 19304 圖形(點陣圖) GNU 圖形處理程式
xsane V:12, I:144 2339 圖形(點陣圖) 用於 SANE 的基於 GTK 的前端圖形介面 (現在存取掃描器就很簡單了)
scribus V:1, I:16 31345 ps/pdf/SVG/… Scribus DTP 編輯器
libreoffice-draw V:72, I:430 10312 圖形(向量) LibreOffice 辦公套件-繪畫
inkscape V:15, I:112 99800 圖形(向量) SVG(可升級向量圖形)編輯器
dia V:2, I:22 3741 圖形(向量) 圖表編輯器(Gtk)
xfig V:0, I:11 7849 圖形(向量) 在圖形介面下,互動式的生成影象變得方便
gocr V:0, I:7 540 image→text 免費 OCR 軟體
eog V:64, I:277 7770 影象(Exif) Eye of GNOME 影象瀏覽程式
gthumb V:3, I:16 5032 影象(Exif) 影象瀏覽器(GNOME)
geeqie V:4, I:15 2522 影象(Exif) 基於 GTK 的影象瀏覽器
shotwell V:17, I:255 6263 影象(Exif) 數碼相片管理器(GNOME)
gwenview V:33, I:106 11755 影象(Exif) 圖片瀏覽器(KDE)
kamera I:105 998 影象(Exif) KDE 上的支援數碼相機的應用軟體
digikam V:1, I:9 293 影象(Exif) 用於 KDE 桌面環境的數字照片管理應用
darktable V:4, I:13 30554 影象(Exif) 攝影師的虛擬燈臺和暗房
hugin V:0, I:8 5208 影象(Exif) 全景圖片合成器
librecad V:1, I:15 8963 DXF,…… 2D CAD 資料編輯器
freecad I:18 36 DXF,…… 3D CAD 資料編輯器
blender V:3, I:28 84492 blend, TIFF, VRML, … 用於動畫的 3D 編輯器
mm3d V:0, I:0 3881 ms3d, obj, dxf, … 基於 OpenGL 的 3D 模型編輯器
fontforge V:0, I:6 3993 ttf, ps, … 用於 PS,TrueType 和 OpenType 的字型編輯器
xgridfit V:0, I:0 806 ttf 用於TrueType 字型的 網格擬合和小字還原技術 的程式

下列 CLI(命令列)的圖形資料轉換、編輯和管理工具的軟體包捕獲了我的眼球。

表格 11.19. 圖形資料工具(CLI 命令列)列表

軟體包 流行度 大小 關鍵詞 說明
imagemagick I:317 74 圖形(點陣圖) 圖形處理程式
graphicsmagick V:1, I:11 5565 圖形(點陣圖) 影象處理程式(imagemagick派生出來的)
netpbm V:28, I:326 8526 圖形(點陣圖) 圖形介面的轉換工具
libheif-examples V:0, I:2 191 heif→jpeg(bitmap) 轉化 高效能影像檔案格式(HEIF) 到 JPEG、PNG 或 Y4M 格式,用 heif-convert(1)命令
icoutils V:7, I:50 221 png↔ico(bitmap) MS Windows 符號和游標轉化為 PNG 格式,或者從 PNG 格式轉化為點陣圖格式 (favicon.ico)
pstoedit V:2, I:52 1011 ps/pdf→image(向量) PostScript 和 PDF 檔案到可編輯的向量圖形的轉換器(SVG)
libwmf-bin V:7, I:119 151 Windows/image(向量) Windows 元檔案 (向量圖形資料) 轉換工具
fig2sxd V:0, I:0 151 fig→sxd(向量) 轉換 XFig 檔案為 OpenOffice.org 繪畫格式
unpaper V:2, I:17 412 image→image 後處理 OCR 掃描頁面的工具
tesseract-ocr V:7, I:33 2228 image→text 基於惠普的商業 OCR 引擎的免費 OCR 軟體
tesseract-ocr-eng V:7, I:34 4032 image→text OCR 引擎資料:用於英文文字的 tesseract-ocr 語言檔案
ocrad V:0, I:3 587 image→text 免費 OCR 軟體
exif V:2, I:42 339 影象(Exif) 顯示 JPEG 檔案中的 EXIF 資訊的指令列工具
exiv2 V:2, I:27 275 影象(Exif) EXIF/IPTC 元資料處理工具
exiftran V:1, I:14 69 影象(Exif) 改變數碼照相機的 jpeg 影象格式
exiftags V:0, I:3 292 影象(Exif) 從數碼相機的 JPEG 檔案讀取 Exif 標籤的實用工具
exifprobe V:0, I:3 499 影象(Exif) 從數碼圖片中讀取元資料
dcraw V:1, I:12 583 image(原始的)→ppm 解碼原始的數碼相機圖片
findimagedupes V:0, I:1 77 image→fingerprint 找到相似或重複的影象
ale V:0, I:0 839 image→image 合併影象來增加保真度或者用於建立馬賽克
imageindex V:0, I:1 145 image(Exif)→html 從圖形中建立靜態 HTML 相簿
outguess V:0, I:1 230 jpeg,png 通用的 Steganographic 工具
jpegoptim V:0, I:7 59 jpeg 最佳化 JPEG 檔案
optipng V:3, I:43 213 png 最佳化 PNG 檔案,無失真壓縮
pngquant V:0, I:9 61 png 最佳化 PNG 檔案,有失真壓縮

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


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

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