CentOS8设置locale

起因

最近在 CentOS 上做文件下载功能调试时,发现了个异常:

1
2
3
4
5
6
java.nio.file.InvalidPathException: Malformed input or input contains unmappable characters: /data/trans/视频.mp4
at sun.nio.fs.UnixPath.encode(UnixPath.java:147)
at sun.nio.fs.UnixPath.<init>(UnixPath.java:71)
at sun.nio.fs.UnixFileSystem.getPath(UnixFileSystem.java:281)
at java.nio.file.Paths.get(Paths.java:84)
...

按照异常提示信息,应该是文件路径中包含了特殊字符之类的,但仔细看了下路径,只包含了中英文字符,那只能猜测系统不支持中文字符了。

测试

新建一个中文名称的文件:

1
2
3
4
5
[root@ecs-centos tmp]# touch 文件.txt
[root@ecs-centos tmp]# ll
total 16
-rw-r--r-- 1 root root 0 Sep 18 16:11 ''$'\346\226\207\344\273\266''.txt'
[root@ecs-centos tmp]#

可以看到文件名变成了“乱码”。

查看系统语言设置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@ecs-centos tmp]# locale 
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
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=

可以看到语言设置的确已经设置成了中文。

查看系统当前支持的语言

虽然语言已经设置了中文 zh_CN.UTF-8,但有可能是系统本身没有中文语言包。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
[root@ecs-centos tmp]# locale -a
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_COLLATE to default locale: No such file or directory
C
C.utf8
POSIX
en_AG
en_AU
en_AU.utf8
en_BW
en_BW.utf8
en_CA
en_CA.utf8
en_DK
en_DK.utf8
en_GB
en_GB.iso885915
en_GB.utf8
en_HK
en_HK.utf8
en_IE
en_IE.utf8
en_IE@euro
en_IL
en_IN
en_NG
en_NZ
en_NZ.utf8
en_PH
en_PH.utf8
en_SC.utf8
en_SG
en_SG.utf8
en_US
en_US.iso885915
en_US.utf8
en_ZA
en_ZA.utf8
en_ZM
en_ZW
en_ZW.utf8

可以看到操作系统并没有中文语言包。

安装中文语言包

1
2
3
4
## 依次执行以下命令
[root@ecs-centos tmp]# yum install glibc-common

[root@ecs-centos tmp]# yum install -y langpacks-zh_CN

验证

重新使用 ll 列出所有文件:

1
2
3
[root@ecs-centos tmp]# ll
总用量 16
-rw-r--r-- 1 root root 0 9月 18 16:26 文件.txt

可以看到文件名可以正常显示了。

再次查看系统当前支持的语言:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
[root@ecs-centos tmp]# locale -a
C
C.utf8
en_AG
en_AU
en_AU.utf8
en_BW
en_BW.utf8
en_CA
en_CA.utf8
en_DK
en_DK.utf8
en_GB
en_GB.iso885915
en_GB.utf8
en_HK
en_HK.utf8
en_IE
en_IE@euro
en_IE.utf8
en_IL
en_IN
en_NG
en_NZ
en_NZ.utf8
en_PH
en_PH.utf8
en_SC.utf8
en_SG
en_SG.utf8
en_US
en_US.iso885915
en_US.utf8
en_ZA
en_ZA.utf8
en_ZM
en_ZW
en_ZW.utf8
POSIX
zh_CN
zh_CN.gb18030
zh_CN.gbk
zh_CN.utf8
zh_HK
zh_HK.utf8
zh_SG
zh_SG.gbk
zh_SG.utf8
zh_TW
zh_TW.euctw
zh_TW.utf8