字符集错误解决

1错误描述与表现

错误描述与表现:
登录服务器发现如下报错

-bash: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): No such file or directory

2错误排查过程

  • 以为是系统字符集的问题,于是打印系统的$LANG,发现并没有异常
#查看系统字符集的几种方式
echo $LANG
env |grep LANG
export |grep LANG
locale|grep LANG
  • 继续执行locale命令,这时报错,错误内容如下
[admin@hehe ~]$ locale
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
LANG=en_US.UTF-8
LC_CTYPE=UTF-8
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

这里发现LC_CTYPE=UTF-8,通过

locale -a|grep UTF-8

并没有找到该字符集,猜想是什么原因导致了LC_CTYPE的的修改


locale把按照所涉及到的文化传统的各个方面分成12个大类,这12个大类分别是:
1、语言符号及其分类(LC_CTYPE)
2、数字(LC_NUMERIC)
3、比较和排序习惯(LC_COLLATE)
4、时间显示格式(LC_TIME)
5、货币单位(LC_MONETARY)
6、信息主要是提示信息,错误信息,状态信息,标题,标签,按钮和菜单等(LC_MESSAGES)
7、姓名书写方式(LC_NAME)
8、地址书写方式(LC_ADDRESS)
9、电话号码书写方式(LC_TELEPHONE)
10、度量衡表达方式 (LC_MEASUREMENT)
11、默认纸张尺寸大小(LC_PAPER)
12、对locale自身包含信息的概述(LC_IDENTIFICATION)。
locale设定的优先级
设定locale就是设定12大类的locale分类属性,即12个LC_。除了这12个变量可以设定以外,为了简便起见,还有两个变量:LC_ALL和LANG
它们之间有一个优先级的关系:LC_ALL > LC_
>LANG。可以这么说,LC_ALL是最上级设定或者强制设定,而LANG是默认设定值。
你什么也不做的话,也就是LC_ALL,LANG和LC_*均不指定特定值的话,系统将采用POSIX作为lcoale,也就是C locale
参考链接


3错误解决

将错误的locale设置好,增加以下设置即可.
参考链接

cat /etc/environment
LANG=en_US.utf8
LC_CTYPE=en_US.utf8
cat /etc/locale.conf
LANG=en_US.UTF8

4故障反思,是什么原因导致的LC_CTYPE改变,进而引发错误呢?

想了下,有两种可能:

  1. 现在都是普通用户,不是root用户,切换回root用户是不存在这个问题的.
  2. 我通过ansible批量分发过文件,这些出现问题的主机都是这些ansible的远程主机,是否和ansible有关系?
posted @ 2019-04-17 20:25  johnsonjie  阅读(723)  评论(0编辑  收藏  举报