linux ssh 中文编码

对于Linux内核来说,运行的内核版本都是一样,只要有对应中文的编码解码规则(字符集),有中文字体显示支持,Linux就能处理好中文信息。
同理,对于其他语言也是一样。

什么是locale

在Linux中,它使用locale命令来设置和显示程序运行的语言环境(也就是系统运行语言环境,应用进程是在系统的进程之上运行的,应用程序的父进程是init进程)

locale的英文直译为场所,地区,地域,但它在Linux中含义要更大,在Linux中Locale根据计算机用户所使用的语言,所在国家或者地区,以及当地的文化传统定义一个软件运行时的语言环境 。

locale的主要作用是描述某一个地域内的人们的语言习惯和文化传统和生活习惯。一个地区的locale就是根据几大类的习惯(变量)定义的。

locale的命名规则

locale 命名规则:

<语言>_<地区>.<字符集编码><@修正值>

例如:
zh_CN.UTF-8,zh代表中文,CN代表大陆地区,UTF-8表示字符集。

de_DE.UTF-8@euro, de表示德语,DE表示德国,UTF-8表示字符集,euro表示按照欧洲习惯加以修正

这个命令规则就是说我们在设置locale的相关变量时,都是使用这种格式给变量进行赋值

locale命令及参数讲解

设置Locale的根本其实就是设置一组总共12个LC开头的变量(不包括LANG和LC_ALL)

Linux中locale文件存放位置: /usr/share/i18n/locales

LANG

LANG的优先级是最低的,它是所有LC_变量的默认值。下方所有以LC_开头变量(不包括LC_ALL)中,如果存在没有设置变量值的变量,那么系统将会使用LANG的变量值来给这个变量进行赋值。如果变量有值,则保持不变,不受影响。可以看到,我们上面示例中的输出中的LC_变量的值其实就是LANG变量决定的

LC_CTYPE

用于字符分类和字符串处理,控制所有字符的处理方式,包括字符编码,字符是单字节还是多字节,如何打印等,这个变量是最重要的。

1
2
3
4
5
6
7
8
9
10
11
LC_NUMERIC              #用于格式化非货币的数字显示。
LC_TIME #用于格式化时间和日期。
LC_COLLATE #用于比较和排序。
LC_MONETORY #用于格式化货币单位。
LC_MESSAGES #用于控制程序输出时所使用的语言,主要是提示信息,错误信息,状态信息, 标题,标签, 按钮和菜单等。
LC_PAPER #默认纸张尺寸大小
LC_NAME #姓名书写方式
LC_ADDRESS #地址书写方式
LC_TELEPHONE #电话号码书写方式
LC_MEASUREMENT #度量衡表达方式
LC_IDENTIFICATION #locale对自身包含信息的概述

LC_ALL

它不是环境变量,它是一个宏,可通过该变量的设置覆盖所有的LC_变量。这个变量设置之后,可以废除LC_的设置值,使得这些变量的设置值与LC_ALL的值一致,注意,LANG变量不受影响。

宏:可能会有人对宏没概念,简单说明下,我们在计算机领域说的宏(Macro),是批量处理的一个说法。宏是一种通过某种指定规则来处理数据的过程,可以称之为语法替换(大家应该在编辑器里匹配替换过数据,但这这里要复杂点),这里不同数据替换,宏是获取某种输入(通常是字符串),然后如何根据事先定义的规则,转换成对应的输出(通常也是字符串)。真实的宏要比这里说的复杂,有兴趣可以自行查资料。
在这里,我们这个宏操作就是用LC_ALL的值去覆盖LC_*的变量值

格式化:上面的含义讲到格式化,可能会有人不太清楚,格式化就是重新设定组织数据的规则,拿我们日常生活举例子,我们要记录一段数据,我们可以记在方格纸上,可以记在横格纸上,可以记在白纸上等等,这里的这种的纸张格式就是组织数据的一种方式,不同格式,记录方式和数据量等都不一样,我们在Windows系统中,经常做的格式化优盘操作就是这样,可以把自带的FAT32格式,重新格式化定义为NTFS格式,你可以理解为,将优盘的记录数据从方格纸方式变成横格纸方式。

优先级级别:LC_ALL>LC_*>LANG

注意:定义这么多变量在某些情况下是很有用的,例如,当我需要一个能够输入中文的英文环境,我可以把 LC_CTYPE设定成zh_CN.GB18030,而其他所有的项都是en_US.UTF-8。

总结:LANG是LC_的默认值,而LC_ALL比LC_的优先级都高,设置完LC_ALL之后,会强制重置LC_的值,如果不将LC_ALL的值重置为空,则无法再去设置LC_的值

补充:一般来说,我们在新装系统之后,我们的变量的值将会是下面这种情况:
NTP-slave:~ # locale
LANG=POSIX
LC_CTYPE=en_US.UTF-8
LC_NUMERIC=”POSIX”
LC_TIME=”POSIX”
LC_COLLATE=”POSIX”
LC_MONETARY=”POSIX”
LC_MESSAGES=”POSIX”
LC_PAPER=”POSIX”
LC_NAME=”POSIX”
LC_ADDRESS=”POSIX”
LC_TELEPHONE=”POSIX”
LC_MEASUREMENT=”POSIX”
LC_IDENTIFICATION=”POSIX”
LC_ALL=

讲解:C是系统默认的locale,而POSIX是C的别名,这是标准的C Locale。它所指定的属性和行为由ISO C标准所指定。当我们新安装完一个系统时,默认的locale就是C或POSIX。
我们这里说的C其实就是ASCII编码。

POSIX:可移植操作系统接口(Portable Operating System Interface of UNIX,缩写为 POSIX ),POSIX标准定义了操作系统应该为应用程序提供的接口标准,是IEEE为要在各种UNIX操作系统上运行的软件而定义的一系列API标准的总称,其正式称呼为IEEE 1003,而国际标准名称为ISO/IEC 9945。
换句话说,为一个POSIX兼容的操作系统编写的程序,可以在任何其它的POSIX操作系统(即使是来自另一个厂商)上编译执行。

总结:POSIX是一种类UNIX系统的通用接口标准,基于这个标准开发的程序,能够灵活的迁移到不同版本系统上使用。

在这里,locale中的POSIX说的就是一种业内统一的默认locale标准,不区分地域,所有Linux发行版本都支持。

常用命令:

查看当前locale设置

locale

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[oracle@CASystem ~]$ locale
LANG=zh_CN.UTF-8
LC_CTYPE=zh_CN.UTF-8
LC_NUMERIC="zh_CN.UTF-8"
LC_TIME="zh_CN.UTF-8"
LC_COLLATE="zh_CN.UTF-8"
LC_MONETARY="zh_CN.UTF-8"
LC_MESSAGES="zh_CN.UTF-8"
LC_PAPER="zh_CN.UTF-8"
LC_NAME="zh_CN.UTF-8"
LC_ADDRESS="zh_CN.UTF-8"
LC_TELEPHONE="zh_CN.UTF-8"
LC_MEASUREMENT="zh_CN.UTF-8"
LC_IDENTIFICATION="zh_CN.UTF-8"
LC_ALL=

查看当前系统的所有可用locale

locale -a

设置系统的locale(此处以zh_CN.utf8为例)

1)编辑文件:/etc/profie,在文件末尾添加以下内容并报错退出

1
2
3
#vim /etc/profile
export LC_ALL=zh_CN.utf8
export LANG=zh_CN.utf8

2)执行生效命令:

1
#source /etc/profile

最后保持Linux服务器端 LC#设置和 ssh工具的编码设置一致,即可正常显示中文