无法将LC_CTYPE设置为默认区域设置:没有此文件或目录

我有和这个问题完全一样的疑问,但是没有解决方案。我尝试了,但是没有起作用。 我该如何修复我的区域设置问题?
$ 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
LANGUAGE=
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=

$ locale -a
locale: Cannot set LC_CTYPE to default locale: No such file or directory
C
C.UTF-8
en_US.utf8
POSIX

这是因为 en_US.UTF-8 和 en_US.utf8 不匹配吗?
如何修复?

你看过这个链接吗?http://askubuntu.com/a/229512/387382 - 0x2b3bfa0
14个回答

这个相同的问题(LC_CTYPE=UTF-8,是错误的)可能发生在你从Mac登录到Linux服务器时,终端自动设置环境变量。有一个复选框可以解决这个问题。取消勾选它,然后你就可以正常使用了。
在iTerm中,它位于配置文件 -> 终端选项卡。
在Terminal中,它位于终端 -> 首选项 -> 配置文件 -> 高级选项卡。

18在iTerm中,取消勾选"首选项>配置文件>默认>终端>环境>自动设置区域变量"复选框。 - RubenLaguna
2虽然这个方法可能有效,但它非常具有侵入性。你还可能影响本地终端的行为以及你连接到的每个主机的行为。尽管你的发现是正确的,但更好的做法是使用ssh_config来确保在已知存在问题的主机上不发送LC_*信息。 - bot47
6请问您能否添加自己的答案,并进一步解释为什么这可能会影响您本地终端的行为,以及如何告诉ssh_config不要发送LC_*。因为您只是简单地-1我的答案,没有真正的解释。 - raarts
2如果您正在使用MacOS的终端连接,请转到终端设置>高级,并取消选中“在启动时设置区域环境变量”。 - javaxian
4似乎发生的情况是:在您的本地系统上安装了某种语言环境,然后您通过SSH连接到另一个没有安装此语言环境的系统。终端客户端将告诉远程系统您的语言环境,但远程系统无法用所请求的语言回应。您有两种解决方法:要么更改所请求的内容,要么将所请求的语言环境添加到远程系统中(这需要root访问权限)。 - Jan
谢谢,这完全适合我的情况。详细来说,它解决了以下命令
export LC_CTYPE="en_US.UTF-8" 但我觉得你的解决方案更清晰。
- sjlee

打开终端并执行以下命令:
export LC_ALL="en_US.UTF-8"

2这个有效,但为什么呢? - Yu Jiaao
58这并不能解决任何问题,因为变量在会话结束时被销毁了。 - Etienne Gautier
请参考以下链接: https://ss64.com/bash/export.html https://help.ubuntu.com/community/EnvironmentVariables https://help.ubuntu.com/community/Locale - Etienne Gautier
真是一句话说得太棒了!哈哈! - Redbob
7当导出这个变量时,我得到的是:-bash: 警告: setlocale: LC_ALL: 无法更改区域设置 (en_US.UTF-8) - nnyby
1为了避免-bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)错误,您可能需要重新启动服务器。 - dtar
2对于那些希望在会话之间保留设置的人,将该行添加到您的 .bashrc 文件中。 - Mehmet Karatay
setlocale: LC_ALL: 无法更改区域设置(en_US.UTF-8):没有此文件或目录 - assayag.org

生成缺失的区域设置,并使用以下命令选择您所需的默认设置:
sudo dpkg-reconfigure locales

3实际上只需要运行sudo dpkg-reconfigure locales命令,因为它会使用locale-gen。 - Etienne Gautier
2这应该是问题的实际答案,而且只有一个。 - netfed
非常感谢您! - Jan Święcki
我正在使用WSL2。运行这个命令后,我得到了一系列错误,其中第一个是perl: warning: Setting locale failed. Thamme Gowda的答案解决了我的问题。 - undefined

我遇到了类似的问题,并在我的/etc/default/locale文件中添加了以下行:
LC_CTYPE="en_US.UTF-8"
LC_ALL="en_US.UTF-8"
LANG="en_US.UTF-8"

我从这篇帖子中得到了这个信息:如何解决我的区域设置问题?

5嗯,这样做会导致本地配置非常混乱。在Ubuntu中,/etc/environment并不用于设置区域设置;应该使用/etc/default/locale。此外,在桌面环境中,永久设置LC_ALL是绝对不应该的。你的方式会使得桌面环境下控制语言/区域设置的界面,如语言支持(Language Support),变得无效。 - Gunnar Hjalmarsson
1这真的有效。重启后。 - Neurotransmitter
2登出和登录,应该可以正常工作。 - Sandjaie Ravi
这是唯一对我有效的解决方案,但正如@GunnarHjalmarsson所指出的那样,它会破坏所有桌面设置(即无法再更改日期格式等)。我花了过去4个小时尝试了我能找到的一切,但没有一种方法可以修复问题而不破坏语言设置界面。是否有一种正确的解决方案 - 不涉及在/etc/default/locale中设置LC_LL这种核心方法? - J23
@Metal450:删掉LC_ALL这一行。它是不必要的。LC_CTYPE这一行足以解决某些远程Mac设备带来的影响。 - Gunnar Hjalmarsson
@GunnarHjalmarsson 感谢您的快速回复 - 我的问题与任何Mac无关(我在本地运行Kubuntu)。如果我去掉LC_ALL,问题就会出现 - 只有包含LC_ALL才能解决问题(当然,在此过程中会清除所有其他区域设置/格式设置)。 - J23
@Metal450:那么你的问题很可能与这个问题的提问者报告的问题完全不同。你可能想要提交一个自己的问题。如果你这样做,请不要忘记提到你正在使用Kubuntu操作系统。 - Gunnar Hjalmarsson
1@GunnarHjalmarsson 谢谢 - 经过几个小时的尝试和错误,我神奇地通过删除并重新安装“locales”软件包来修复了它。真奇怪!但还是谢谢你的回复 :) - J23
这个解决了问题。谢谢! - Mr. Polywhirl

这个命令救了我的命。
echo "LC_ALL=en_US.UTF-8" | sudo tee -a /etc/environment
echo "en_US.UTF-8 UTF-8" | sudo tee -a /etc/locale.gen
echo "LANG=en_US.UTF-8" | sudo tee -a /etc/locale.conf
sudo locale-gen en_US.UTF-8

5文件在sudo之前就已经被打开了。除非你已经是root用户,否则重定向不会起作用。 - Martin Thornton
@MartinThornton,问题已经解决 :) - pa4080
1终于!这个有效了!其他的都不行(树莓派) - skywinder
当我在root用户下时,这个有效。 - Jonathan R
这是我在树莓派上使用perl时遇到本地化警告时唯一有效的解决方法。 - s1037989

export LC_ALL="en_US.UTF-8"
export LC_CTYPE="en_US.UTF-8"
sudo dpkg-reconfigure locales

1我之前在一个几乎干净的Vultr实例上运行,遇到了与问题中描述的类似的问题,检查了环境变量,一切看起来都没问题。然而,运行sudo dpkg-reconfigure locales后,问题应该就解决了。现在我的SSH会话正常了。谢谢! - Jonas

locale 命令的输出可以看出,您的环境中存在这样一行错误的设置:
LC_CTYPE="UTF-8"

("UTF-8" 不是一个有效的区域设置名称。)
通常来自于 /etc/default/locale。如果有的话,请删除该行并重新登录。
如果不是来自那里,可能来自您的 shell 配置,或者如果您通过 SSH 远程登录,则可能来自客户端机器的配置。

我需要将 LC_CTYPE 改成 utf8 吗? - user390493
@Lucas:不,那样也一样糟糕。由于已经设置了LANG,你可以直接删除以LC_CTYPE开头的整行内容。 - Gunnar Hjalmarsson
如果你想设置LC_TYPE,你也应该将它设置为"en_US.UTF-8"。 - user77036
如果它来自客户端机器的配置,您可以使用dpkg-reconfigure locales在服务器上添加区域设置。 - Paul Rougieux

/etc/default/locale文件可以有额外的(但是不必要的)行: 示例文件可能如下所示:
#  File generated by update-locale
LANG=en_US.UTF-8
LANGUAGE="en_IN:en

为了整理和成功生成和重新配置区域设置,请删除或注释掉此文件中除以下行之外的所有行:
LANG=en_US.UTF-8

文件最终应该看起来像这样:
#  File generated by update-locale
LANG=en_US.UTF-8
# LANGUAGE="en_IN:en

完成后,运行dpkg-reconfigure locales,在选择区域设置时选择en_US.UTF-8,然后你就可以开始了。当过程完成时,你将收到一条生成完成。的消息。

我在Pi-OS bullseye上遇到了同样的问题。对我有效的方法是编辑/etc/default/locale
我添加了以下行(至少对于德语):

LC_ALL=de_DE.UTF-8
然后重新登录并简单地执行以下命令:
sudo dpkg-reconfigure locales
这样就完成了 - 在此之后没有出现任何错误。

只有Ubuntu和官方衍生版本才是本论坛的讨论主题。 - ChanganAuto
好吧。但也许这在Ubuntu上和pi-os上都能行,因为它们有着“同源”的关系——你测试过吗? - DaS

$ sudo export LC_All=C.UTF-8 (you should use it)
$ sudo update-locale