9.4 其他 vim 使用注意事项

vim 其实不是那么好学,虽然他的功能确实非常强大!所以下面我们还有一些需要注意的地方要来跟大家分享喔!

9.4.1 中文编码的问题

很多朋友常常哀嚎,说他们的 vim 里面怎么无法显示正常的中文啊?其实这很有可能是因为编码的问题! 因为中文编码有 big5 与 utf8 两种,如果你的文件是使用 big5 编码制作的,但在 vim 的终端接口中你使用的是万国码(utf8), 由于编码的不同,你的中文文件内容当然就是一堆乱码了!怎么办?这时你得要考虑许多东西啦!有这些:

  1. 你的 Linux 系统默认支持的语系数据:这与 /etc/locale.conf 有关;
  2. 你的终端接口 (bash) 的语系: 这与 LANG, LC_ALL 这几个变量有关;
  3. 你的文件原本的编码;
  4. 打开终端机的软件,例如在 GNOME 下面的窗口接口。

事实上最重要的是上头的第三与第四点,只要这两点的编码一致,你就能够正确的看到与编辑你的中文文件。 否则就会看到一堆乱码啦!

一般来说,中文编码使用 big5 时,在写入某些数据库系统中,在“许、盖、功”这些字体上面会发生错误! 所以近期以来大多希望大家能够使用万国码 utf8 来进行中文编码!但是在中文 Windows 上的软件常常默认使用 big5 的编码 (不一定是 windows 系统的问题,有时候是某些中文软件的默认值之故), 包括鸟哥由于沿用以前的文件数据文件,也大多使用 big5 的编码。此时就得要注意上述的这些咚咚啰。

在 Linux 本机前的 tty1~tty6 原本默认就不支持中文编码,所以不用考虑这个问题!因为你一定会看到乱码!呵呵! 现在鸟哥假设俺的文件文件内编码为 big5 时,而且我的环境是使用 Linux 的 GNOME ,启动的终端接口为 GNOME-terminal 软件, 那鸟哥通常是这样来修正语系编码的行为:

[dmtsai@study ~]$ LANG=zh_TW.big5
[dmtsai@study ~]$ export LC_ALL=zh_TW.big5

然后在终端接口工具列的“终端机”-->“设置字符编码” -->“中文 (正体) (BIG5)”项目点选一下, 如果一切都没有问题了,再用 vim 去打开那个 big5 编码的文件,就没有问题了!以上!报告完毕!

9.4.2 DOS 与 Linux 的断行字符

我们在第六章里面谈到 cat 这个指令时,曾经提到过 DOS 与 Linux 断行字符的不同。 而我们也可以利用 cat -A 来观察以 DOS (Windows 系统) 创建的文件的特殊格式, 也可以发现在 DOS 使用的断行字符为 ^M$ ,我们称为 CR 与 LF 两个符号。 而在 Linux 下面,则是仅有 LF ($) 这个断行符号。这个断行符号对于 Linux 的影响很大喔! 为什么呢?

我们说过,在 Linux 下面的指令在开始执行时,他的判断依据是 “Enter”,而 Linux 的 Enter 为 LF 符号, 不过,由于 DOS 的断行符号是 CRLF ,也就是多了一个 ^M 的符号出来, 在这样的情况下,如果是一个 shell script 的程序文件,呵呵~将可能造成“程序无法执行”的状态~ 因为他会误判程序所下达的指令内容啊!这很伤脑筋吧!

那怎么办啊?很简单啊,将格式转换成为 Linux 即可啊!“废话”,这当然大家都知道,但是, 要以 vi 进入该文件,然后一个一个删除每一列的 CR 吗?当然没有这么没人性啦! 我们可以通过简单的指令来进行格式的转换啊!

不过,由于我们要操作的指令默认并没有安装,鸟哥也无法预期你有没有网络,因此假设你没有网络的状况下, 请拿出你的原版光盘,放到光驱里头去,然后使用下面的方式来安装我们所需要的这个软件喔!

[dmtsai@study ~]$ su -   # 安装软件一定要是 root 的权限才行!
[root@study ~]# mount /dev/sr0 /mnt
[root@study ~]# rpm -ivh /mnt/Packages/dos2unix-*
warning: /mnt/Packages/dos2unix-6.0.3-4.el7.x86_64.rpm: Header V3 RSA/SHA256 ....
Preparing...                          ################################# [100%]
Updating / installing...
   1:dos2unix-6.0.3-4.el7             ################################# [100%]
[root@study ~]# umount /mnt
[root@study ~]# exit

那就开始来玩一玩这个字符转换吧!

[dmtsai@study ~]$ dos2unix [-kn] file [newfile]
[dmtsai@study ~]$ unix2dos [-kn] file [newfile]
选项与参数:
-k  :保留该文件原本的 mtime 时间格式 (不更新文件上次内容经过修订的时间)
-n  :保留原本的旧文件,将转换后的内容输出到新文件,如: dos2unix -n old new

范例一:将 /etc/man_db.conf 重新复制到 /tmp/vitest/ 下面,并将其修改成为 dos 断行
[dmtsai@study ~]# cd /tmp/vitest
[dmtsai@study vitest]$ cp -a /etc/man_db.conf .
[dmtsai@study vitest]$ ll man_db.conf
-rw-r--r--. 1 root root 5171 Jun 10  2014 man_db.conf
[dmtsai@study vitest]$ unix2dos -k man_db.conf
unix2dos: converting file man_db.conf to DOS format ...
# 屏幕会显示上述的讯息,说明断行转为 DOS 格式了!
[dmtsai@study vitest]$ ll man_db.conf
-rw-r--r--. 1 dmtsai dmtsai 5302 Jun 10  2014 man_db.conf
# 断行字符多了 ^M ,所以容量增加了!

范例二:将上述的 man_db.conf 转成 Linux 断行字符,并保留旧文件,新文件放于 man_db.conf.linux
[dmtsai@study vitest]$ dos2unix -k -n man_db.conf man_db.conf.linux
dos2unix: converting file man_db.conf to file man_db.conf.linux in Unix format ...
[dmtsai@study vitest]$ ll man_db.conf*
-rw-r--r--. 1 dmtsai dmtsai 5302 Jun 10  2014 man_db.conf
-rw-r--r--. 1 dmtsai dmtsai 5171 Jun 10  2014 man_db.conf.linux
[dmtsai@study vitest]$ file man_db.conf*
man_db.conf:       ASCII text, with CRLF line terminators  # 很清楚说明是 CRLF 断行!
man_db.conf.linux: ASCII text

因为断行字符以及 DOS 与 Linux 操作系统下面一些字符的定义不同,因此, 不建议你在 Windows 系统当中将文件编辑好之后,才上传到 Linux 系统,会容易发生错误问题。 而且,如果你在不同的系统之间复制一些纯文本时,千万记得要使用 unix2dos 或 dos2unix 来转换一下断行格式啊!

9.4.3 语系编码转换

很多朋友都会有的问题,就是想要将语系编码进行转换啦!举例来说,想要将 big5 编码转成 utf8 。 这个时候怎么办?难不成要每个文件打开会转存成 utf8 吗?不需要这样做啦!使用 iconv 这个指令即可! 鸟哥将之前的 vi 章节做成 big5 编码的文件,你可以照下面的链接来下载先:

在终端机的环境下你可以使用“ wget 网址”来下载上述的文件喔!鸟哥将他下载在 /tmp/vitest 目录下。 接下来让我们来使用 iconv 这个指令来玩一玩编码转换吧!

[dmtsai@study ~]$ iconv --list
[dmtsai@study ~]$ iconv -f 原本编码 -t 新编码 filename [-o newfile]
选项与参数:
--list :列出 iconv 支持的语系数据
-f     :from ,亦即来源之意,后接原本的编码格式;
-t     :to ,亦即后来的新编码要是什么格式;
-o file:如果要保留原本的文件,那么使用 -o 新文件名,可以创建新编码文件。

范例一:将 /tmp/vitest/vi.big5 转成 utf8 编码吧!
[dmtsai@study ~]$ cd /tmp/vitest
[dmtsai@study vitest]$ iconv -f big5 -t utf8 vi.big5 -o vi.utf8
[dmtsai@study vitest]$ file vi*
vi.big5: ISO-8859 text, with CRLF line terminators
vi.utf8: UTF-8 Unicode text, with CRLF line terminators
# 是吧!有明显的不同吧! ^_^

这指令支持的语系非常之多,除了正体中文的 big5, utf8 编码之外,也支持简体中文的 gb2312 , 所以对岸的朋友可以简单的将鸟站的网页数据下载后,利用这个指令来转成简体,就能够轻松的读取文件数据啰! 不过,不要将转成简体的文件又上传成为您自己的网页啊!这明明是鸟哥写的不是吗? ^_^

不过如果是要将正体中文的 utf8 转成简体中文的 utf8 编码时,那就得费些功夫了! 举例来说,如果要将刚刚那个 vi.utf8 转成简体的 utf8 时,可以这样做:

[dmtsai@study vitest]$ iconv -f utf8 -t big5 vi.utf8 | \
> iconv -f big5 -t gb2312 | iconv -f gb2312 -t utf8 -o vi.gb.utf8