哥们儿姐们儿,今天咱们聊聊MobaXterm那该死的乱码问题。说起来都是泪,刚开始用这玩意儿的时候,简直要被它气死。那时候刚换了个新活儿,单位配的机器,也习惯了用MobaXterm去连服务器搞开发。结果,输入中文文件名,或者程序里打点日志出来,屏幕上一片问号,或者就是那种方块字,看着就心烦。
本站为89游戏官网游戏攻略分站,89游戏每日更新热门游戏,下载请前往主站地址:www.gm89.icu
刚开始遇到这事儿,我能怎么办?当然是第一时间去网上搜!百度、谷歌轮番上阵,搜什么“MobaXterm中文乱码”、“MobaXterm显示异常”之类的。结果出来的都是一些“改字体”、“改编码为UTF-8”的教程。我一看,这简单,赶紧照着做。
我点开了MobaXterm的设置,找到那个“Terminal settings”,里头有个“Font”和“Charset”。我把字体先换成了“Consolas”或者“YaHei Consolas Hybrid”,想着是不是字体不支持中文。换完一试,屁用没有,照样乱码。然后我又改那个“Charset”,从默认的“UTF-8”改成“GBK”、“GB2312”,甚至“BIG5”都试了一遍。改来改去,每次都满怀希望地重新连上服务器,然后又一次次失望地看着那一堆乱七八糟的字符。当时真想把键盘砸了,感觉这软件就是来搞我的。
折腾了几次,发现网上那些“万能教程”对我来说根本不灵,我就开始琢磨了。这乱码到底是怎么回事?我以前用SecureCRT就没这问题。是不是MobaXterm有什么特别的地方?我又仔细看了一下,发现MobaXterm每次启动会话的时候,下面会刷一些信息,其中提到了“locale”和“encoding”。我心想这玩意儿是不是跟服务器的语言环境有关系?
于是我换了个思路,不只盯着MobaXterm自己的设置看,也开始去服务器上找原因。我先用MobaXterm连上服务器,输入`locale`命令。这一看不要紧,发现服务器的`LANG`变量竟然是空的,或者设成了`C`这种很基础的,根本不支持中文的环境。MobaXterm本地是UTF-8,服务器上却是这种“原始”的编码,那可不就乱套了吗?这就好比你用英语问话,结果对方用法语回答,谁也听不懂谁。
找到了这个突破口,我开始试着去改服务器的locale。我试着在当前会话里直接设置:
- `export LANG=zh_*-8`
- `export LC_ALL=zh_*-8`
敲完这两行命令,再试着输入中文,奇迹发生了!中文正常显示了!当时那种感觉,真是柳暗花明又一村,简直比发工资还开心。但新的问题来了,这只是临时生效,我一退出会话再进来,或者打开新的会话,它又回到乱码状态了。这肯定不行,总不能每次都手动设置一遍。
那怎么办?当然是让它永久生效!我琢磨着,得把这东西写进配置文件里去。我想到了用户自己的配置文件,比如`~/.bashrc`或者`~/.profile`。我用`vi`打开了`~/.bashrc`,在文件末尾加了这两行:
- `export LANG="zh_*-8"`
- `export LC_ALL="zh_*-8"`
保存退出,然后执行`source ~/.bashrc`让它立即生效,或者直接退出会话再重新连接。果然,这回好了,永久生效了!
但是,事情还没完。有个同事也遇到了同样的问题,他也是跟着我这么改的,结果发现他服务器上根本就没有`zh_*-8`这个locale。我去他服务器上看了下,输入`locale -a`,发现输出的列表里确实没有中文locale。这就好比你让人说中文,结果人家根本没学过中文。这时候,就得去安装中文语言包了。具体怎么装,不同的Linux发行版还不一样。比如在CentOS上,我一般用`yum install -y kde-l10n-Chinese`或者`yum install -y glibc-langpack-zh`。Ubuntu上就用`apt-get install -y language-pack-zh-hans`。装完之后,可能还得生成一下locale,用`locale-gen zh_*-8`。搞定这些,再把上面的环境变量一设,他的乱码问题也彻底解决了。
经过这回折腾,我算是彻底搞明白了MobaXterm乱码的根源:
MobaXterm本地终端的编码设置(通常是UTF-8)要和远程服务器的locale(特别是LANG和LC_ALL环境变量)保持一致。而且服务器上必须安装并生成了对应的语言包。
有时候,MobaXterm自身的会话设置里也有个“Remote environment”的地方,可以勾选“Send locale environment variables”,这个默认是勾选的,理论上MobaXterm会尝试把本地的locale发到服务器。但实际用起来,我发现还是手动在服务器端配置好最靠谱,毕竟不是所有服务器都能完美接收这些变量并正确应用。我自己是习惯了,MobaXterm里保持默认的UTF-8,然后服务器端保证`LANG`和`LC_ALL`都设成`zh_*-8`,并且对应的语言包也装
从那以后,再遇到MobaXterm乱码的问题,我心里就有底了。先看MobaXterm的“Terminal settings”里面的“Charset”是不是UTF-8,这个一般默认都是对的。然后赶紧连上服务器,输入`locale`看看`LANG`是不是`zh_*-8`,如果不是,就先临时`export`一下试试,确认能解决。就是去改服务器的配置文件,或者安装语言包,让它永久生效。
这一路摸索过来,真是费老鼻子劲了。不过也得谢谢这乱码,让我把Linux的locale配置给彻底搞明白了。现在再有新来的小伙子问我MobaXterm乱码怎么办,我都能给他一套完整的解决方案,不再是网上那种简单粗暴的“改个编码”就完事儿了。这,就是实践出真知!