第 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.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 生成,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 源码可以从 texbook.tex 的 www.ctan.org tex-archive 站点上下载。此文件包含了绝大多数所需的宏指令。我听说把文档中的第7到第10行注释了并且添加 "\input manmac \proofmodefalse",就可以用 tex(1) 来处理此文档。我强烈建议去购买这本书 (还有 Donald E. Knuth 写的其他书) 而不是使用在线版本,但是在线版本中的源码确实是学习 Tex 输入很好的例子!

在 Debian 系统中,可打印的数据是 PostScript 格式的。对于非 PostScript 打印机,通用 Unix 打印系统 (CUPS) 使用 Ghostscript 作为其后台光栅(rasterizer)处理程序。

在最近的 Debian 系统中,可印刷的数据,也可以用 PDF 格式表示。

PDF 文件能够使用 GUI(图形用户界面)的查看工具显示,它的排版条目也可以被填充到 GUI(图形用户界面)查看工具,比如 EvinceOkular (参见 第 7.4 节 “GUI(图形用户界面)应用”); 以及现代浏览器,比如 Chromium

PDF 文件能够使用某些图像工具编辑,比如 LibreOfficeScribusInkscape (参见 第 11.6 节 “图形数据工具”)。

你能够使用 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 编码内容。

如下是关于图形数据转换、编辑和管理的工具包。

表 11.17. 图形数据工具列表

软件包 流行度 大小 关键词 说明
gimp V:51, I:252 19303 图形(位图) GNU 图形处理程序
imagemagick I:317 74 图形(位图) 图形处理程序
graphicsmagick V:1, I:12 5565 图形(位图) 图像处理程序(imagemagick派生出来的)
xsane V:12, I:143 2339 图形(位图) 用于 SANE 的基于 GTK 的前端图形界面 (现在访问扫描仪就很简单了)
netpbm V:27, I:326 8526 图形(位图) 图形界面的转换工具
libheif-examples V:0, I:2 191 heif→jpeg(bitmap) 转化 高性能图像文件格式(HEIF) 到 JPEG、PNG 或 Y4M 格式,用 heif-convert(1)命令
icoutils V:7, I:51 221 png↔ico(bitmap) MS Windows 符号和光标转化为 PNG 格式,或者从 PNG 格式转化为位图格式 (favicon.ico)
scribus V:1, I:17 30242 ps/pdf/SVG/… Scribus DTP 编辑器
libreoffice-draw V:69, I:426 10311 图形(矢量) LibreOffice 办公套件-绘画
inkscape V:14, I:114 99800 图形(矢量) SVG(可升级矢量图形)编辑器
dia V:2, I:23 3908 图形(矢量) 图表编辑器(Gtk)
xfig V:0, I:11 7849 图形(矢量) 在图形界面下,交互式的生成图像变得方便
pstoedit V:2, I:53 1004 ps/pdf→image(矢量) PostScript 和 PDF 文件到可编辑的矢量图形的转换器(SVG)
libwmf-bin V:7, I:121 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:8, I:34 2228 image→text 基于惠普的商业 OCR 引擎的免费 OCR 软件
tesseract-ocr-eng V:8, I:34 4032 image→text OCR 引擎数据:用于英文文本的 tesseract-ocr 语言文件
gocr V:0, I:7 545 image→text 免费 OCR 软件
ocrad V:0, I:3 578 image→text 免费 OCR 软件
eog V:60, I:274 7770 图像(Exif) Eye of GNOME 图像浏览程序
gthumb V:4, I:17 5032 图像(Exif) 图像浏览器(GNOME)
geeqie V:4, I:15 2256 图像(Exif) 基于 GTK 的图像浏览器
shotwell V:17, I:252 6263 图像(Exif) 数码相片管理器(GNOME)
gtkam V:0, I:4 1154 图像(Exif) 从数码照相机中检索多媒体数据的应用 (GTK)
gphoto2 V:0, I:8 947 图像(Exif) gphoto2 软件是命令行方式的管理数码相机的工具
gwenview V:33, I:105 11755 图像(Exif) 图片浏览器(KDE)
kamera I:104 998 图像(Exif) KDE 上的支持数码相机的应用软件
digikam V:2, I:10 293 图像(Exif) 用于 KDE 桌面环境的数字照片管理应用
exiv2 V:2, I:27 275 图像(Exif) EXIF/IPTC 元数据处理工具
exiftran V:1, I:15 69 图像(Exif) 改变数码照相机的 jpeg 图像格式
jhead V:0, I:8 132 图像(Exif) 处理兼容 JPEG 文件 (数码相机图片) 的 Exif 中的非图形部分
exif V:2, I:41 339 图像(Exif) 显示 JPEG 文件中的 EXIF 信息的命令行工具
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 工具
librecad V:1, I:15 8963 DXF CAD 数据编辑器(KDE)
blender V:3, I:27 84492 blend, TIFF, VRML, … 用于动画的 3D 编辑器
mm3d V:0, I:0 3881 ms3d, obj, dxf, … 基于 OpenGL 的 3D 模型编辑器
open-font-design-toolkit I:0 9 ttf, ps, … 用于开放字型设计的元包
fontforge V:0, I:7 3980 ttf, ps, … 用于 PS,TrueType 和 OpenType 的字体编辑器
xgridfit V:0, I:0 806 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