我如何解决我的区域设置问题?

每次我做一些像启动或停止服务的操作时,都会收到这个消息。
perl: warning: Setting locale failed.   
perl: warning: Please check that your locale settings:   
        LANGUAGE = "en_US:en",   
        LC_ALL = (unset),   
        LC_MESSAGES = "en_US.UTF-8",   
        LANG = "en_US.UTF-8"   
    are supported and installed on your system.   
perl: warning: Falling back to the standard locale ("C").   
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   
(Reading database ... 21173 files and directories currently installed.)  
Removing bind9 ...  
 * Stopping domain name service... bind9                                        [ OK ]
Processing triggers for man-db ...   
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   

怎么修复这个错误?

所有用户的简单而永久的解决方案:https://askubuntu.com/questions/881742/locale-cannot-set-lc-ctype-to-default-locale-no-such-file-or-directory-locale/893586#893586 - Galvani
你需要说:你的机器?还是你只有一个用户登录,无法更改系统设置?(是的,我知道这是一个非常老的问题。错误答案的赞数令人震惊) - Rusi
20个回答

首先运行 locale 来列出当前用户帐户中当前定义的语言环境:

$ locale
LANG=C
LANGUAGE=
LC_CTYPE=fi_FI.UTF-8
LC_NUMERIC="C"
LC_TIME="C"
LC_COLLATE=fi_FI.UTF-8
LC_MONETARY="C"
LC_MESSAGES=fi_FI.UTF-8
LC_PAPER="C"
LC_NAME="C"
LC_ADDRESS="C"
LC_TELEPHONE="C"
LC_MEASUREMENT="C"
LC_IDENTIFICATION="C"
LC_ALL=

然后生成缺失的区域设置并重新配置区域设置以进行通知。
$ sudo locale-gen "en_US.UTF-8"
Generating locales...
  en_US.UTF-8... done
Generation complete.

$ sudo dpkg-reconfigure locales
Generating locales...
  en_US.UTF-8... up-to-date
Generation complete.

现在你将不再看到任何错误了!

268对我来说没有起作用 - Umair Ayub
4这在我使用的多个系统上都有效。有没有办法在新安装的系统上避免这个问题? - Brylie Christopher Oxley
13@UmairAyub 也许你有多个未知的语言环境,试试这个方法:for y in $(locale | cut -d '=' -f 2| sort |uniq );do locale-gen $y; done。它会为每个定义生成一个语言环境。 - Ivan Buttinoni
1locale-gen 命令中的区域设置应该用双引号括起来,以使其正常工作:$ sudo locale-gen "en_US.UTF-8" - Sheharyar
这在我的Ubuntu 14.04上没有起作用,我仍然收到控制台错误。 - alexserver
所以最后我不得不手动在我的.bachrc文件中添加export LC_ALL="en_US.UTF-8",这样就修复了错误提示。但是...为什么gen-locale没有配置这个变量呢?这个命令不应该管理这个吗? - alexserver
5注销并重新登录可能会有所帮助。 - S.M.Mousavi
尝试重新启动,只有手动导出变量才能解决问题。 - Prashanth Chandra
1记得打开一个新的终端来测试它。 - deFreitas
6@Umair 这个问题存在很高的人为错误风险。你的系统默认配置为 en_GB,但你将其设置为了 en_US。你需要手动在 /etc/locale.gen 中注释掉 en_GB 并取消注释 en_US。请参考我在硬件 Raspberry Pi 3b 和系统 Raspbian Jessie 上的回答 http://askubuntu.com/a/790373/25388。 - Léo Léopold Hertz 준영
谢谢。我很长时间都无法更新我的软件,有时候由于停止进程和重新启动系统,操作系统会崩溃。 - Paul Thomas
实际上,只有在执行"sudo dpkg-reconfigure locales"命令时才有效果。从长列表中选择"en_US.UTF-8"(使用空格进行选择),然后按Enter键。再次选择en_US.UTF-8作为默认选项,然后按Enter键。 - Anonymous
我有点建议,如果你在尝试执行 locale -a 时遇到错误,可能需要先安装 locales。在Ubuntu上,只需执行以下命令安装 localessudo apt-get install locales - Bhoom Suktitipat
在Ubuntu 16.04.3 LTS下,完美地在Windows子系统中运行。不确定如何破坏了语言环境,但这个修复解决了问题。 - WinEunuuchs2Unix
非常好用!真的很有帮助。 - Thanh Hải
жИСеЬ®ињРи°Мsudo locale-gen "en_US.UTF-8"дєЛеРОпЉМйЬАи¶БиЊУеЕ•159еТМ3гАВ - alper
这对我来说有效,即使/etc/default/localelocale的输出没有改变。 - Sridhar Sarnobat
locale-gen不接受任何参数,它只是生成之前通过dpkg-reconfigure locales选择的所有区域设置,所以在这里是无用的。 - ggll

在我的情况下(Ubuntu Server 12.04LTS),上述提到的方法都没有起作用。最终帮助我解决问题的是将以下内容添加到文件/etc/environment中:
LC_ALL=en_US.UTF-8
LANG=en_US.UTF-8

因为某种原因它不见了。区域设置和其他命令的输出看起来变量是正确定义的。换句话说,不要认为所有基本的东西都已经在应该声明的地方声明好了。

131是的,除了这个之外没有其他的工作过,可能是因为它是更新版本。但我更喜欢把它放在/etc/default/locale中。 - Naveed
30已更新/etc/default/locale,不再出现警告。谢谢。 - ohho
9是的,其他的对我没用。这个可以。 这是我用于无人值守更新的一行命令。sudo sh -c "echo 'LC_ALL=en_US.UTF-8\nLANG=en_US.UTF-8' >> /etc/environment" - dman
16@user163207 你的解决方案是错误的,因为它追加内容而不是覆盖,这不是推荐的文件,并且echo需要以启用反斜杠转义的方式运行。这个修正后的命令与你的相同:sh -c "echo -e 'LANG=en_US.UTF-8\nLC_ALL=en_US.UTF-8' > /etc/default/locale" - glarrain
2我在我的Ubuntu云镜像上遇到了相同的问题。 - Umair Ayub
我使用了这种方法,但是我引用了地区值,比如LC_ALL="en_US.UTF-8",然后我仍然遇到了错误。移除引号解决了问题。 - HVNSweeting
1您需要注销并重新登录以使这些更改生效。 - Basil
1(虽然这是一个老问题,但)不应该触碰LC_ALL,它是一个覆盖(所有其他区域设置)的设置,无论是本地还是远程。基本上,这意味着你在强制使用它(我认为这不是一个可行的解决方案:)) - Nostromov
15别忘了注销并重新登录! - S.M.Mousavi
这是我在全新的Raspbian安装上所使用的方法。/etc/default/locale文件中只有LANG行,没有LC_ALL行。 - John Baber-Lucero
1如果我省略LC_ALL行,我将继续收到错误。这是对我有效和可靠的唯一解决方案。由于设置LC_ALL,我应该注意什么? - Prashanth Chandra
2需要退出会话并重新登录。 - jruzafa
只想说这个有效。 - Ru Chern Chong
@glarrain 对这个基础进行部分修复是危险的:仅仅让它覆盖会删除/etc/environment的其他部分。虽然它可以正常工作,但可能会在很久之后才被注意到时破坏某些东西。 - Volker Siegel
@prasanthchandra:错误出现在哪里?你把它放在哪个文件中了(参考glarain的回答)?从根本上说:(1) locale 和 (2) locale -a 的输出是什么? - Rusi
1基本上,@nostromov是正确的。不应该设置LC_ALL。如果通过设置它来使事情“工作”,那只是一个权宜之计——其他地方可能出了问题,并且仍然存在。 - Rusi

发行后,它们应该消失。
sudo locale-gen en_US en_US.UTF-8
sudo dpkg-reconfigure locales 

dpkg-reconfigure在软件包已经安装后重新配置它们。将要重新配置的软件包的名称传递给它。它会询问配置问题,就像当初安装软件包时一样。


10很高兴我一年前的困扰能帮助你解决这个问题 ;) - Rinzwind
1这个地区设置默认应该生成吗?我的意思是,默认情况下会有enen_AUen_CAen_GB,但没有en_US - Daniel Serodio
@Rinzwind 非常感谢您的努力!我深表歉意,我应该更好地阐述我的问题。我想问的是:为什么在生成新的区域设置之后需要重新配置区域设置软件包?对我来说,即使没有dpkg-reconfigure,区域设置似乎也能正常工作。 - Victor
使用Ubuntu 14.04,在一个Docker容器中,所以没有设置任何东西。Django的makemessage需要这个。这个完美地运行了!谢谢。 - Justin
我认为缺少sudo。也许应该是:sudo dpkg-reconfigure locales。在我安装了Ubuntu 14.10桌面版64位之后,这个方法对我有效。 - bgoodr
注销并重新登录可能会有所帮助。 - S.M.Mousavi
不知怎么的,在en_US.UTF8之前需要运行sudo locale-gen en_US。希望这能彻底解决问题(在多个Ubuntu版本后)。 - prusswan
这只是一个完美的解决方案。 - Arush Salil
对于AWS EC2,这将起作用。 - Yogesh Yadav
1我知道在这里讨论Raspbian不太相关,但是我想提一下,在LC_ALL正确设置之前,我不得不注销并重新登录。 - MatrixManAtYrService
谢谢!这个解决了我的问题,但其他答案没有。我在AWS EC2上使用的是Ubuntu 19.10。 - amitp

只需将以下内容添加到您的.bashrc文件中(假设您正在使用bash)
export LC_ALL="en_US.UTF-8"

3这个甜蜜的解决方案对我在我的Amazon EC2镜像上(运行着他们默认的RHEL AMI)非常有效。非常感谢!:) - gideon
这个对我来说很有效,适用于我的DigitalOcean的Ubuntu 12.04镜像。 - Inan
3这解决了我的问题。我得问一个问题:为什么 LC_ALL 没有像其他答案中所说的那样被 locale-gen 命令设置好呢? - alexserver
1奇怪,以上所有的解决方案对我都没有用,但是这个却有效!在导出LC_ALL之后,我终于可以使用sudo dpkg-reconfigure locales了。 - sobi3ch
终于在尝试了很多方法之后,我找到了适用于我的Kubuntu 14.04.3 LTS的解决方案。谢谢! - Yunus
@sobi3ch 之后你可能不需要 LC_ALL。(重新配置后,你应该会发现 LANG 被正确设置了)作为临时的 hack 设置是可以的,但长期稳定不行。(是的,这是旧的。只是提醒一下,因为它目前正在强化一种不好的做法) - Rusi
我之前一直使用zsh(oh-my-zsh),但最终是这个问题指引了我正确的方向。~/.zshrc文件包含以下内容:# export LANG=en_US.UTF-8取消注释export LANG这一行对于我在Ubuntu 18.04上使用xfce4-terminal(在一个精简的XFCE桌面虚拟机中)解决了问题。 - hotwebmatter
旧评论,但在Ubuntu 20.04 LTS上刚刚帮了我:) - taiyodayo

这是一个常见的问题,如果你是远程连接的话,解决办法就是不要转发你的本地设置。编辑/etc/ssh/ssh_config文件,注释掉SendEnv LANG LC_*这一行。

6我之前试了其他的答案,但是忘记了我是在远程连接的情况下,直到看到你的答案。ssh服务器和客户端使用不同的区域设置导致了问题。 - Hieu
2在OSX上(连接到Ubuntu),它位于/etc/ssh_config - Michiel de Mare
一行代码实现此功能:sed -e '/SendEnv/ s/^#*/#/' -i /etc/ssh/ssh_config(适用于服务器配置)。 - Albin
我无法在本地机器上设置LC_ALL,但它解决了我与远程服务器的问题,谢谢。 - Alexander Shlenchack
3值得注意的是,您需要在本地机器上编辑文件,而不是远程机器。 - Clashsoft
太完美了。我尝试了所有其他答案,都对我无效。谢谢。 - moghaddam
在macOS High Sierra上,它仍然是/etc/ssh/ssh_config - Jin Kwon
这适用于AWS EC2实例。 - Jin Kwon

有一个命令可以做到这一点:
sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8

它使用提供的值更新/etc/default/locale。
要应用更改,您可以
source /etc/default/locale

5这是合法的!别忘了注销/重新加载你的shell,否则你看不到变化。别忘了查看生成和重新配置区域设置的批准答案。 - Erik Živković
2运行locale仍然没有显示任何utf值。 - Cerin
@Cerin:也许漏掉了对 locale-gen 的调用。在此之前,需要执行 apt-get install locales - koppor
2这不会改变Ubuntu 16.04上根Shell的LANG,因为在/root/.profile中被覆盖了。 - Willem
1*** update-locale: Error: invalid locale settings: LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8 - alper
1@alper 首先你需要运行命令 locale-gen "en_US.UTF-8",然后再使用 sudo dpkg-reconfigure locales 命令进行检查。 - Pablo Bianchi

在12.10版本中对我有效的是:

apt-get install language-pack-en-base  

这是在dpkg-reconfigure locales没有产生任何结果之后。

2这是最好的答案。并不是我的区域设置有问题,而是它们实际上并不存在。我认为这与原帖中的问题相似(如果你的区域设置正确,“没有该文件或目录”是非常明确的!)。 - Breakthrough
1每次我在Ubuntu 12.04上使用apt-get时,都会遇到这个问题。这个方法完美地解决了它,而且不需要编辑任何文件。 - Deepend
language-pack-en-base已经是最新版本。 - karlingen
注销和登录可能有所帮助。 - S.M.Mousavi
在Debian下的Ubuntu chroot中对我起作用了。谢谢 :) - Wyatt Ward
我会扩展解决方案:您可以生成一个命令来安装当前区域设置中提到的所有语言(无论是什么组合)。这是命令:locale|tr -d '"'|cut -d= -f2|cut -d_ -f1|sort|uniq|while read lang; do [[ $lang ]] && echo apt install language-pack-$lang-base; done(我不会说这是最短的,但它有效)。 - gluk47
这在Ubuntu 18.04 LTS上也适用。 - PHZ.fi-Pharazon
这在Debian上不起作用,而apt-get install locales-all运行得很好。 - undefined

不要忘记退出你的SSH会话(或者你的X11),通过退出并重新登录来完成。除非我重新登录,否则所有这些建议对我都没有起作用...

2这条评论应该获得更多的点赞,或者至少每个回答中都需要突出显示这个事实。 - ni8mr

我陷入了一个奇怪的状态,在这个状态下,我的本地机器设置为es,因此通过vagrant连接的远程机器处于未处理的状态。因此,我不得不手动使用export=来成功运行dpkg-reconfigure。然后系统运行正常。
export LC_ALL="en_US.UTF-8"
sudo dpkg-reconfigure locales

1最好的!由于dpkg-recofigure显示乱码。 - Tomilov Anatoliy
1这是唯一一个有效的。 - Eric

对于Ubuntu 12.10,除了ratzs的解决方案之外,其他方法都没有起作用。我建议将以下内容添加到您的/etc/bash.bashrc文件中:
export LC_ALL="en_ZA.UTF-8"
export LC_CTYPE="en_ZA.UTF-8"

在所有上述的解决方案中,这是唯一一个对我有效的。 - JohnnyQ