V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
codingbody
V2EX  ›  SSH

遇到一个有趣的 ssh 的问题

  •  2
     
  •   codingbody · 2021-08-12 23:53:48 +08:00 · 1436 次点击
    这是一个创建于 1184 天前的主题,其中的信息可能已经有所发展或是发生改变。

    今天使用的 mac 的 Terminal.app 连接服务器,启动一个 java 进程,发现这个 java 服务的中的中文出现了乱码,于是我在启动的时候设置了一下启动参数 -Dfile.encoding=utf-8 试了一下,发现中文不乱码了,

    但是同事说,他昨天也启动过这个 java 进程,中文并没有乱码,并且这期间也没有修改过服务器的任何配置,(同事使用的是 win 的 xshell ),我感觉非常奇怪,基本可以排除服务器的关系,似乎是和使用的终端有关。

    于是我移除了 -Dfile.encoding=utf-8 参数,使用 Termius.app 这个工具登录了服务,启动这个 java 进程观察,发生也是没有乱码的。

    到此,基本可以确定,不同的终端的确是影响的服务器的一些环境变量了。

    于是我写了一个小测试类。用两个终端登录服务器后,执行。

    public class Test{   
        public static void main(String[] args){   
            System.out.println(System.getProperty("file.encoding"));   
            System.out.println("测试中文是否乱码");  
        }   
    }  
    

    测试结果一:


    ANSI_X3.4-1968

    ????????

    测试结果二:


    UTF-8

    测试中文是否乱码


    后来查资料发现,ssh 登录的时候,默认会把本地的 locale 发送到服务端,而我本地没有配置这个变量,默认值是 UTF-8,服务端也不认识,就出现了乱码。

    • 发送本地的 locale 到远程的主机的配置: vim /etc/ssh/ssh_config 中的 SendEnv LANG LC_*
    • 设置本地的 locale (我用的是 zsh): vim ~/.zshrc 添加 export LC_ALL=en_US.UTF-8 和 export LANG=en_US.UTF-8
    第 1 条附言  ·  2021-08-13 14:46:47 +08:00
    补充 Locale 知识: http://wiki.ubuntu.org.cn/Locale
    第 2 条附言  ·  2022-12-08 19:32:26 +08:00

    Linux 中 sortuniq 等命令输出的结果,也会受到系统中 locale 配置的影响,我是在 sort 一份含有中文的文档时发现的。

    可以通过以下设置解决:

    LC_ALL=C sort example.txt
    

    或者

    export LC_ALL=C sort example.txt
    

    为什么是设置 LC_ALL=C

    3 条回复    2021-08-13 09:32:15 +08:00
    ericFork
        1
    ericFork  
       2021-08-13 05:18:23 +08:00
    就是这样,投币鼓励一下 :P
    sutra
        2
    sutra  
       2021-08-13 07:13:17 +08:00
    加油。
    todd7zhang
        3
    todd7zhang  
       2021-08-13 09:32:15 +08:00
    学到了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1370 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 17:42 · PVG 01:42 · LAX 09:42 · JFK 12:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.