Windows GUI 的设计思想是低学习成本,但使用成本很高

*nix Shell 的哲学是低使用成本,但学习成本很高

为什么?GUI界面即使第一次使用也能看出个八九不离十,SHELL界面嘛,一般人用不了。Server管理是一项复杂繁琐的事情,很多操作很精细,并且有些需要经常性的重复。在这种情况下,使用GUI就不是一件让人感觉良心的事情了。对于Programming人员和Server管理人员来讲,使用 Shell / 脚本才是更加明智的选择。特别是需要精细地重复性执行一些操作的时候。

Windows 的 cmd 界面实在是弱爆了,工具也是几近于无!为此我不得不在Server上使用 Cygwin 系统。网上可以找到不少资料,但对于中文环境,貌似像我这样干的人似乎不多,资料也不是很全面。

虽然关于 Cygwin 中文乱码的解决方法不少。但很多已经过时,基本上也只是讲下怎么配置,没有内在的思考及解说原理。

首先,默认的情况下,打开 Cygwin ,打一条命令调用 cmd 的程序,随便哪一条,只要有输出中文的。你会发现显示的是乱码。

比如, net start motherfucker

cygwin-gibberish

然后就会看到中文的乱码。这时只要右击 Cygwin 左上角的图标,在 Options  里面的 Text 选 Locale = C, Charset = GBK 。再打命令就能看到中文的错误提示。如果是 date 命令,输出的会是英文的日期。这个说明 locale 会影响日期和货币这些七七八八的系统杂项输出格式。

而 Charset 则是指定 Cygwin 的界面的字符编码,cmd 是采取系统区域的方式来输出中文字符,它可不会配合 Cygwin 的系统变量神马的,因此只有让 Cygwin 去配合它了。另外还需要在 ~/.bash_profile 中增加一条 export LANG=C.GBK 的命令,这样 Cygwin 下面的工具也基本能正常工作了。

唯一的问题是 vim 在读取 utf-8 文件的时候还是会出现乱码(还有 cat)

由于我经常要查看 log ,属于 utf-8 编码。因此我是通过编码全局的 ~/.vimrc 来硬性指定

1
2
3
set fileencodings=utf-8,chinese,cp936
set termencoding=gbk
set encoding=utf-8

这样设置之后打开 utf-8 也可以正常显示中文了

cat 的话比较麻烦,要通过管道 iconv 来解决:

1
cat filanme.log | iconv -f utf-8 -t gbk

所以基本上,这里有三大 encoding

  1. termencoding  在 Cygwin 的 options 中进行设定。指定界面显示的字符集,解决 cmd 不
  2. LANG 系统变量。这个主要放在 sshd 的 ~/.bash_profile ,对服务端输出的设定。
  3. 针对 utf-8 文件要进行特别的读取编码指定或者进行转码