目前我们开发的项目最终都是部署到服务器上,而服务器一般而言都是Linux的操作系统。大部分情况下,服务器字符编码都是UTF-8的,开发环境也基本都是UTF-8。然鹅,最近待的公司,一些服务器字符编码是GBK,我本地默认的UTF-8登录上去中文直接乱码。
本文介绍了如何快速无痛地解决本地UTF-8环境登录GBK的服务器。由于现在是Mac的重度使用者,所以本文也就介绍了Mac下如何完美解决SSH连接GBK服务器,Windows的机器SecureCRT可以完美解决这个问题,自行谷歌一下。
我一直使用的是iterm2终端(当然,Mac自带的terminal终端也很好用)。
一开始的时候,我是使用创建不同的profile来指定iterm2的编码方式,用着也还算OK,唯一蛋疼的就是,每当需要GBK编码时候,都得右键重新开一个iterm2的窗口,而且通过command+t新开出来的页面还是采用了default profile。
所以就需要浓重地推出本文的主角——luit
luit介绍
luit 命令是一个过滤器,在任意应用程序和UTF-8终端仿真器之间运行。luit命令将应用程序输出从语言环境的编码转换为UTF-8,并将终端输入从UTF-8转换为语言环境的编码。
多语言应用程序必须设置为仅生成
UTF-8代码。不得使用命令生成UTF-8之外的输出。
luit命令由终端以透明方式调用。有关从命令行运行luit命令的信息,请参见示例。
SSH执行过程图示
在终端中执行命令,通信过程示意图如图1或者图2所示。


执行命令时,使用终端模拟器配置的编码方案,对原命令字符串进行编码,将得到的字节流传递给“命令执行单元”;
展现命令执行结果时,获取字节流形式的命令执行结果,使用终端模拟器配置的编码方案,对其进行解码,得到字符串形式的命令执行结果。
使用luit后的执行过程
通过使用luit命令,现在在终端模拟器中执行命令,通信过程示意图如图3或者图4所示。


此时执行命令时,使用终端模拟器配置的编码方案,对原命令字符串进行编码,得到字节流,再使用UTF-8编码方案进行解码得到字符流,最后使用luit命令中指定的编码方案(比如luit -encoding GBK program [args]中的GBK)进行编码,将得到的字节流传递给“命令执行单元” ;
展现命令执行结果时,获取字节流形式的命令执行结果,使用luit命令中指定的编码方案进行解码得到字符流,再使用UTF-8编码方案进行编码得到字节流,最后对得到的字节流使用终端模拟器配置的编码方案进行解码,得到字符串形式的命令执行结果。
安装
上面介绍了一堆SSH和luit的原理,下面抓紧进入正题,安装使用luit。
从luit官网下载相应的源码,然后解压编译安装1
2
3
4
5
6
7
8
9
10
11
12 解压
tar zxvf luit.tar.gz
进入源码文件夹,可能版本会不一样
cd luit-20180508
配置
./configure
编译
make
安装
make install
卸载
make uninstall
安装完成后,最简单的使用方式就是luit -encoding gbk ssh了,这已经能满足我们目前的需求了,当然为了学深学透,我们还是在下一章节介绍一下luit命令的全部语法
使用
语法
1 | luit [ options ] [ -- ] [ program [ args ] ] |
options
| 项目 | 描述 |
|---|---|
| -h | 显示帮助摘要。 |
| -list | 列示受支持的字符集和编码。 |
| -v | 详细。 |
| -c | 将标准输入转换为标准输出。 |
| -x | 在子函数终止时立即退出。这可能会导致 luit 命令在子函数的输出结束时丢失数据。 |
| -argv0 name | 设置随 argv[0] 命令传递的子代的名称。 |
| -encoding encoding | 指定 luit 命令使用当前语言环境编码之外的编码。 |
| +oss | 禁止在应用程序输出中解释单个 shift。 |
| +ols | 禁止在应用程序输出中解释锁定 shift。 |
| +osl | 禁止在应用程序输出中解释字符集选择序列。 |
| +ot | 禁止解释所有序列并将应用程序输出中的所有序列原样传递到终端。 |
| -k7 | 为键盘输入生成 7 位字符。 |
| +kss | 禁止为键盘输入生成单个 shift。 |
| +kssgr | 在键盘输入的单个 shift 后使用 GL 代码。缺省情况下,会在生成 8 位键盘输入时在单个 shift 后生成 GR 代码。 |
| -kls | 为键盘输入生成锁定 shift (SO/SI)。 |
| -gl | gn 设置 GL 的初始分配。参数必须为 g0、g1、g2 或 g3。缺省值取决于语言环境,通常为 g0。 |
| -gr | gk 设置 GR 的初始分配。缺省值取决于语言环境,通常为 g2(EUC 语言环境除外,这种语言环境的缺省值为 g1)。 |
| -g0 charset | 设置在 G0 中最初选择的 charset 的值。缺省值取决于语言环境,但通常为 ASCII。 |
| -g1 charset | 设置在 G1 中最初选择的 charset 的值。缺省值取决于语言环境。 |
| -g2 charset | 设置在 G2 中最初选择的 charset 的值。缺省值取决于语言环境。 |
| -g3 charset | 设置在 G3 中最初选择的 charset 的值。缺省值取决于语言环境。 |
| -ilog filename | 将从子代接收的所有字节记录到 filename 文件中。 |
| -olog filename | 将发送到终端仿真器的所有字节记录到 filename 文件中。 |