Debian 是一种流行的 Linux 操作系统,提供了丰富的文本数据转换工具。在 Debian 中,我们可以使用 iconv 命令来完成文本编码转换、文件名转换等操作,使用编辑器和文本处理工具来进行纯文本格式化、提取等操作。
文本数据转化工具列表:
软件包 | 流行度 | 大小 | 关键词 | 说明 |
libc6 | V:925, I:999 | 12987 | 字符集 | 使用 iconv(1) 的不同语言环境(locale)之间的文本编码转换器 (基础的) |
recode | V:2, I:19 | 601 | 字符集+换行 | 不同语言环境(locale)之间的文本编码转换器(多功能的,更多别名和特性) |
konwert | V:1, I:48 | 134 | 字符集 | 不同语言环境(locale)之间的文本编码转换器(高档的) |
nkf | V:0, I:9 | 360 | 字符集 | 日语字符集翻译 |
tcs | V:0, I:0 | 518 | 字符集 | 字符集翻译 |
unaccent | V:0, I:0 | 35 | 字符集 | 代替重音字符,使用和它们相当的非重音字符 |
tofrodos | V:1, I:18 | 51 | 换行 | 在 DOS 和 Unix 之间的文本格式转换: fromdos(1) 和 todos(1) |
macutils | V:0, I:0 | 312 | 换行 | 在 Macintosh 和 Unix 之间的文本格式转换: frommac(1) 和 tomac(1) |
一、iconv命令
iconv(1) 是 libc6 软件包的一部分并且它可以在类 Unix 的系统上转换字符的编码。能够通过如下的命令用 iconv(1) 来转换文本文件的编码。
$ iconv -f encoding1 -t encoding2 input.txt >output.txt
编码值是大小写不敏感的,且会在匹配时忽略“-”和“_”。可以使用“iconv -l”命令检查支持的编码。
编码值和用法的列表:
编码值 | 用法 |
ASCII | 美国信息交换标准代码,7位代码不带重音符号 |
UTF-8 | 用于所有现代操作系统的多语言标准 |
ISO-8859-1 | 旧的西欧语言标准,ASCII + 重音符号 |
ISO-8859-2 | 旧的东欧语言标准,ASCII + 重音符号 |
ISO-8859-15 | 旧的带有欧元符号的西欧语言标准(ISO-8859-1) |
CP850 | code page 850,用于西欧语言的微软 DOS 的带有图形的字符,ISO-8859-1 的变体 |
CP932 | code page 932, 日语 Microsoft Windows 的 Shift-JIS 变体 |
CP936 | code page 936,用于简体中文的微软操作系统风格的 GB2312,GBK 或者 GB18030 的变体 |
CP949 | code page 949,用于韩语的微软操作系统风格的 EUC-KR 或者 Unified Hangul Code 的变体 |
CP950 | code page 950,用于繁体中文的微软操作系统风格的 Big5 的变体 |
CP1251 | code page 1251,用于西里尔字母的微软操作系统风格的编码 |
CP1252 | code page 1252,用于西欧语言的微软操作系统风格的 ISO-8859-15 的变体 |
KOI8-R | 用于西里尔字母的旧俄语 UNIX 标准 |
ISO-2022-JP | 日文邮件的标准编码,只使用 7 位字节 |
eucJP | 老的日文 UNIX 标准的 8 位字节,和 Shift-JIS 完全不同 |
Shift-JIS | 日文 JIS X 0208 |
像 ASCII 和 ISO-8859 这样适用于单字节的字符集,字符编码和字符集几乎指的是同一件事情。对于多字符的字符集,比如说,用于日文的 JIS X 0213,或用于差不多所有语言的 Universal Character Set (UCS, Unicode, ISO-10646-1) , 有多种编码方案来序列化它们的字节数据。
- 日文的 EUC 和 ISO/IEC 2022 (也被称为 JIS X 0202);
- Unicode 的 UTF-8、UTF-16/UCS-2 和 UTF-32/UCS-4 编码。
对于以上这些,字符集和字符编码之间有着明显的区别;而对某些计算机厂家而言,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”。
二、检查文件编码
能够通过如下命令用 iconv(1) 来检查一个文本文件是不是用 UTF-8 编码的。
$ iconv -f utf8 -t utf8 input.txt >/dev/null || echo "non-UTF-8 found"
在上面的例子中使用 “–verbose” 参数来找到第一个 non-UTF-8 字符。
三、转换文件名
这里是一个示例脚步,在同一目录下,将在老的操作系统系统下创建的文件名编码,转换为现代 UTF-8.
#!/bin/sh ENCDN=iso-8859-1 for x in *; do mv "$x" "$(echo "$x" | iconv -f $ENCDN -t utf-8)" done
四、换行符转换
文本文件的格式,特别是行尾(换行符)编码,有平台独立性。
不同平台的换行符样式列表:
平台 | 换行符编码 | 控制码 | 十进制 | 16 进制 |
---|---|---|---|---|
Debian (unix) | LF | ^J |
10 | 0A |
MSDOS 和 Windows | CR-LF | ^M^J |
13 10 | 0D 0A |
苹果的 Macintosh | CR | ^M |
13 | 0D |
换行符转换程序, fromdos(1), todos(1), frommac(1), 和 tomac(1), 是相当方便. recode(1) 也是有用的。
注意:
- 在 Debian 系统上的一些数据,如 python-moinmoin 软件包的 wiki 页面数据,使用 MSDOS 式样的 CR-LF 作为换行符编码。所以,上面的规则仅仅是一个通用规则;
- 大部分编辑器 (比如: vim, emacs, gedit, …) 能够透明处理 MSDOS 式样的换行符文件;
- 对于混合 MSDOS 和 Unix 式样的文件,统一到 MSDOS 换行符式样,使用 “sed -e ‘/\r$/!s/$/\r/'” 代替 todos(1) 比较好。 (例如,在使用 diff3(1)移植两个 MSDOS 式样的文件后.)这是因为 todos 给所有的行增加 CR。
五、TAB转换
这里有一些转换 TAB 代码的专业工具。
bsdmainutils 和 coreutils 包中的用于转换 TAB 的命令列表:
功能 | bsdmainutils |
coreutils |
---|---|---|
把制表符扩展成空格 | “col -x “ |
expand |
将空格转换为制表符(unexpand) | “col -h “ |
unexpand |
indent 包中的 indent(1) 命令能够重新格式化 C 程序中的空格。例如 vim 和 emacs 这样的编辑软件可以被用来扩展 TAB。就拿 vim 来说,能够按顺序输入 “:set expandtab” 和 “:%retab” 命令来扩展 TAB。也可以按顺序输入 :%set noexpandtab” 和 “:%retab” 命令来复原。
六、自动转换编辑器
像 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”。
七、提取纯文本
如下所示读入 web 页面并把它转化成文本文件。当从 Web 中拷贝配置或者是在 web 页面中应用类似 grep(1) 的基础 Unix 文本工具时,以下命令是非常有用的。
$ w3m -dump https://www.remote-site.com/help-info.html >textfile
同样,可以使用如下所示的工具从其他格式提取纯文本数据。
用于提取纯文本数据的工具列表:
软件包 | 流行度 | 大小 | 关键词 | 功能 |
w3m | V:14, I:188 | 2837 | html→text | 用 “w3m -dump” 命令把 HTML 转化为文本的转换器 |
html2text | V:3, I:53 | 274 | html→text | 高级的 HTML 到文本文件的转换器 (ISO8859-1) |
lynx | V:24, I:329 | 1948 | html→text | 用 “lynx -dump” 命令把 HTML 转化为文本的转化器 |
elinks | V:3, I:21 | 1654 | html→text | 用 “elinks -dump” 命令把 HTML 转化为文本的转换器 |
links | V:3, I:29 | 2314 | html→text | 用 “links -dump” 命令把 HTML 转化为文本的转换器 |
links2 | V:1, I:12 | 5492 | html→text | 用 “links2 -dump” 命令把 HTML 转化为文本的转换器 |
catdoc | V:14, I:154 | 686 | MSWord→text,TeX | 转化 MSWord 文件到纯文本或 TeX文件 |
antiword | V:1, I:8 | 589 | MSWord→text,ps | 转化 MSWord 文件到纯文本或 ps 文件 |
unhtml | V:0, I:0 | 40 | html→text | 从一个 HTML 文件里面删除标记标签 |
odt2txt | V:2, I:39 | 60 | odt→text | 从开放文档格式到文本格式的转化器 |
八、高亮并格式化数据
可以通过如下所示的来高亮并格式化纯文本数据。
高亮纯文本数据的工具列表:
软件包 | 流行度 | 大小 | 关键词 | 说明 |
vim-runtime | V:18, I:399 | 36525 | 高亮 | 用 “:source $VIMRUNTIME/syntax/html.vim” Vim 宏命令转化源代码到 HTML |
cxref | V:0, I:0 | 1190 | c→html | 从 C 程序到 latex 和 HTML 的转换器(C语言) |
src2tex | V:0, I:0 | 622 | 高亮 | 转换许多源代码到 TeX(C语言) |
source-highlight | V:0, I:5 | 2115 | 高亮 | 转换源代码到带有高亮显示的 HTML, XHTML, LaTeX, Texinfo, ANSI 颜色转义序列和 DocBook 文件 (C++) |
highlight | V:0, I:5 | 1373 | 高亮 | 转化许多源代码到带有高亮显示的 HTML, XHTML, RTF, LaTeX, TeX or XSL-FO 文件。(C++) |
grc | V:0, I:5 | 208 | text→有颜色的 | 用于任何文本的通用颜色生成器 (Python) |
pandoc | V:8, I:45 | 194495 | text→any | 通用标记转化器 (Haskell) |
python3-docutils | V:13, I:51 | 1804 | text→any | 重构文本文档到 XML (Python) |
markdown | V:0, I:9 | 58 | text→html | Markdown 文本文档到 (X)HTML (Perl) |
asciidoctor | V:0, I:7 | 98 | text→any | AsciiDoc 文本文档格式化到 XML/HTML (Ruby) |
python3-sphinx | V:6, I:23 | 2755 | text→any | 基于文档发布系统 (Python)重构文本 |
hugo | V:0, I:5 | 69551 | text→html | 基于 Markdown 的静态站点发布系统(Go) |