在基于Ubuntu的Docker容器中操作代码时,发现在本机上显示正常的中文注释,在容器中都是乱码。查看locale,找到了原因:
locale是Linux系统中多语言环境的接口,locale命令可以设置和显示程序运行的语言环境。在本例中,通过locale命令查看到的语言环境都是“POSIX”,显然无法支持中文显示。所以,接下来就需要寻找方法来设置可支持中文显示的语言环境。
locale的设置包括12个以LC_开头的变量,如上面截图中的LC_CTYPE~LC_IDENTIFICATION 12个变量。这12个变量分别代表:
- LC_CTYPE:语言符号及其分类,
- LC_NUMERIC:数字,
- LC_TIME:时间显示格式,
- LC_COLLATE:比较和排序习惯,
- LC_MONETARY:货币单位,
- LC_MESSAGES:信息,如提示信息、错误信息、状态信息、标题、标签、按钮和菜单等,
- LC_PAPER:默认纸张大小,
- LC_NAME:姓名书写方式,
- LC_ADDRESS:地址书写方式,
- LC_TELEPHONE:电话号码书写方式,
- LC_MEASUREMENT:度量衡表达方式,
- LC_IDENTIFICATION:locale对自身包含信息的概述。
locale在Ubuntu系统中的默认存放位置为:/usr/share/i18n/locales。
locale的语法规则:<语言>_<地区>.<字符集编码><@修正值>,例如zh_CN.UTF-8中,zh表示中文,CN表示中国大陆,UTF-8表示字符集。
让我们来看一下容器中已有的字符集:
没有我们想要的中文字符集,所以接下来需要安装一下:
apt-get -y install language-pack-zh-hans
安装完成后,再次执行locale -a,发现已经多了两个中文字符集zh_CN.utf8和zh_SG.utf8
Locale的设置
1. 修改/etc/profile文件
设置locale的方式有多种,我使用的是修改/etc/profile的方式。在/etc/profile的最下面添加如下两句:
export LC_ALL=zh_CN.utf8
export LANG=zh_CN.utf8
执行source /etc/profile 使其生效。然后,再次查看locale,已经发生了变化。
2. 修改/etc/locale.gen文件
执行vim /etc/locale.gen,可以看到该文件的内容:
将需要的语言和字符集的注释打开,并执行locale-gen命令使其生效。
3. 命令行设置
localectl set-locale LANG=zh_CN.UTF-8
4. 修改/etc/default/locale文件
注销重新登陆后生效。
5. 创建/etc/locale.conf文件
通过vim /etc/locale.conf创建文件,并写入需要的语言选项,然后通过source /etc/locale.conf使其生效。
该方法未经验证,需要的同学可自行尝试。
完成locale的设置后,容器中的中文乱码问题得到解决。