目前我们开发的项目最终都是部署到服务器上,而服务器一般而言都是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 文件中。 |