如何从Perl修复语言环境设置警告

当我运行perl时,我收到警告:

perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
LANGUAGE = (unset),
LC_ALL = (unset),
LANG = "en_US.UTF-8"
are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").

我该怎么修?

706810 次浏览

这通常意味着您没有在Linux框上正确设置区域设置。

在Debian或Ubuntu上,这意味着您需要执行

$ sudo locale-gen
$ sudo dpkg-reconfigure locales

请参阅man locale-gen

您的操作系统不知道en_US.UTF-8

你没有提到具体的平台,但我可以重现你的问题:

% uname -a
OSF1 hunter2 V5.1 2650 alpha
% perl -e exit
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
LC_ALL = (unset),
LANG = "en_US.UTF-8"
are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").

我的猜测是您使用ssh从较新的台式机连接到这个较旧的主机。/etc/ssh/sshd_config包含

AcceptEnv LANG LC_*

这允许客户端将这些环境变量的值传播到新会话中。

如果您不需要完整的语言环境,该警告会提示您如何压制它:

% env LANG=C perl -e exit
%

或者使用Bash:

$ LANG=C perl -e exit
$ 

对于永久修复,请选择其中一个

  1. 在旧主机上,在shell的初始化文件中设置LANG环境变量。
  2. 在客户端修改您的环境,e. g.,而不是ssh hunter2,使用命令LANG=C ssh hunter2
  3. 如果您有管理员权限,请通过注释当地/etc/ssh/ssh_config文件中的SendEnv LANG LC_*行来阻止ssh发送环境变量。(感谢这个答案。有关更多信息,请参阅错误1285 for OpenSSH。)

以下是如何在Mac OS X v10.7(Lion)或Cygwin(Windows 10)上解决它:

将以下行添加到主机上的bashrcbash_profile文件中:

# Setting for the new UTF-8 terminal support in Lion
export LC_CTYPE=en_US.UTF-8
export LC_ALL=en_US.UTF-8

如果您使用的是z shell(zsh),请编辑文件zshrc

# Setting for the new UTF-8 terminal support in Lion
LC_CTYPE=en_US.UTF-8
LC_ALL=en_US.UTF-8

如果您使用debootstrap创建rootfs,您将需要生成语言环境。您可以通过运行来执行此操作:

# (optional) enable missing locales
sudo nano /etc/locale.gen


# then regenerate
sudo locale-gen

这个提示来自https://help.ubuntu.com/community/Xen

仅适用于macOS和Mac OS X用户

我在使用git时收到了同样的警告

要解决此警告取消勾选Set locale environment variable on startup选项并重新启动您的终端。下面的屏幕截图代表我的终端设置。

在此处输入图片描述

将以下内容添加到/etc/environment为我修复了Debian和Ubuntu上的问题(当然,修改以匹配您要使用的语言环境):

LANGUAGE=en_US.UTF-8
LC_ALL=en_US.UTF-8
LANG=en_US.UTF-8
LC_CTYPE=en_US.UTF-8

按照接受的答案:

LANG=C ssh hunter2.

LC_ALL=C ssh hunter2

在客户端为我做了这个把戏。

用途:

export LANGUAGE=en_US.UTF-8
export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
export LC_CTYPE=en_US.UTF-8

它适用于debian。我不知道为什么-但是locale-gen没有结果。

重要!这是一个临时解决方案。它必须为每个会话运行。

您需要在/etc/default/locale注销登录中适当配置语言环境,然后运行常规命令

root@host:~# echo -e 'LANG=en_US.UTF-8\nLC_ALL=en_US.UTF-8' > /etc/default/locale
root@host:~# exit
local-user@local:~$ ssh root@host
root@host:~# locale-gen en_US.UTF-8
root@host:~# dpkg-reconfigure locales

如果您在CentOS中运行chroot,请尝试手动将/usr/lib/locale复制到存在此问题的帐户的chroot环境。

另一个与Git相关的答案:

问题的根源可能是Git服务器。如果所有其他方法都失败了,请尝试在服务器上执行dpkg-reconfigure locales(或任何适合您的发行版的操作)。

sudo nano /etc/locale.gen

取消注释您要使用的语言环境(例如en_US.UTF-8 UTF-8):

然后运行:

sudo /usr/sbin/locale-gen

图片来源:配置区域设置

一如既往,魔鬼在细节中…

Mac OS X v10.7.5(狮子)上,为了修复一些Django错误,在我的~/.bash_profile中我设置了:

export LANG=en_EN.UTF-8
export LC_COLLATE=$LANG
export LC_CTYPE=$LANG
export LC_MESSAGES=$LANG
export LC_MONETARY=$LANG
export LC_NUMERIC=$LANG
export LC_TIME=$LANG
export LC_ALL=$LANG

反过来,很长一段时间我在使用Perl时得到了这个警告。

我的错!我很久以后才意识到,我的系统是en_US.UTF-8! 我只是简单地改变它从

export LANG=en_EN.UTF-8

export LANG=en_US.UTF-8

在Debian上,经过多次搜索,这确实奏效了。

第一:

sudo apt-get purge locales

然后:

sudo aptitude install locales

著名的:

sudo dpkg-reconfigure locales

这会清除系统中的语言环境,然后重新安装语言环境并将libc6从2.19降级到2.13,这是问题所在。然后它再次配置语言环境。

在我的例子中,这是输出:

LANGUAGE = (unset),
LC_ALL = (unset),
LC_PAPER = "ro_RO.UTF-8",
LC_ADDRESS = "ro_RO.UTF-8",
....

解决办法是:

sudo locale-gen ro_RO.UTF-8

这是Ubuntu中的简单修复。您必须从头开始生成Locales,从命令行运行以下命令:

sudo locale-gen en_US en_US.UTF-8
sudo dpkg-reconfigure locales

这应该创建语言环境,然后重新配置它们。

我现在正在使用这个:

$ cat /etc/environment
...
LC_ALL=en_US.UTF-8
LANG=en_US.UTF-8

然后退出SSH会话并再次登录。

老答案:

只有这个帮助了我:

$ locale
locale: Cannot set LC_ALL to default locale: No such file or directory
LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE=en_US.UTF-8
LC_NUMERIC=ru_RU.UTF-8
LC_TIME=ru_RU.UTF-8
LC_COLLATE="en_US.UTF-8"
LC_MONETARY=ru_RU.UTF-8
LC_MESSAGES="en_US.UTF-8"
LC_PAPER=ru_RU.UTF-8
LC_NAME=ru_RU.UTF-8
LC_ADDRESS=ru_RU.UTF-8
LC_TELEPHONE=ru_RU.UTF-8
LC_MEASUREMENT=ru_RU.UTF-8
LC_IDENTIFICATION=ru_RU.UTF-8
LC_ALL=


$ sudo su


# export LANGUAGE=en_US.UTF-8
# export LANG=en_US.UTF-8
# export LC_ALL=en_US.UTF-8


# locale-gen en_US.UTF-8
Generating locales...
en_US.UTF-8... up-to-date
Generation complete.


# dpkg-reconfigure locales
Generating locales...
en_AG.UTF-8... done
en_AU.UTF-8... done
en_BW.UTF-8... done
en_CA.UTF-8... done
en_DK.UTF-8... done
en_GB.UTF-8... done
en_HK.UTF-8... done
en_IE.UTF-8... done
en_IN.UTF-8... done
en_NG.UTF-8... done
en_NZ.UTF-8... done
en_PH.UTF-8... done
en_SG.UTF-8... done
en_US.UTF-8... up-to-date
en_ZA.UTF-8... done
en_ZM.UTF-8... done
en_ZW.UTF-8... done
Generation complete.


# exit


$ locale
LANG=en_US.UTF-8
LANGUAGE=en_US.UTF-8
LC_CTYPE="en_US.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=en_US.UTF-8

LC_ALL="en_GB.utf8"添加到/etc/environment并重新启动。仅此而已。

ssh默认覆盖LC区域设置变量。参见/etc/ssh/sshd_config

AcceptEnv LANG LC_*

因此,也许您需要在本地shell中设置这些变量。

尝试重新安装:

localess apt-get install --reinstall locales

阅读更多如何更改默认语言环境

如果您使用Mac OS X v10.10(Yosemite)或更高版本在服务器Linux中进行连接,您可以尝试以下步骤。

  1. 保持你的文件 /etc/ssh/sshd-config原件

  2. 穿上你的~/。bash_profile

    export LANG="en_US"
    export LC_ALL=$LANG.UTF-8
    
  3. Run

    dpkg-reconfigure locales
    

    选择“en_US.UTF-8”

perl: warning: Falling back to the standard locale ("C").
locale: Cannot set LC_ALL to default locale: No such file or directory

解决方案:

试试这个(uk_UA.UTF-8是我当前的语言环境。写下你的语言环境,例如en_US.UTF-8!)

sudo locale-gen uk_UA.UTF-8

还有这个。

sudo dpkg-reconfigure locales

如果您不关心语言环境问题,您可以设置PERL_BADLANG=0。当然,这可能会导致不正确的本地化。

对我来说,在ubuntu 16.04(Xenial Xerus)上,以下操作有效:

root@host:~#locale-gen en_GB.UTF-8
root@host:~#localectl set-locale LANG=en_GB.UTF-8,LC_ALL=en_GB.UTF-8

然后重启…

使用zsh ohmyzsh,我将其添加到.zshrc

 # You may need to manually set your language environment
LANGUAGE=en_US.UTF-8
LANG=en_US.UTF-8
LC_CTYPE=en_US.UTF-8
LC_ALL=en_US.UTF-8

通过删除行export LANG=en_US.UTF-8

重新打开一个新标签并SSHed,为我工作:)

前面所有的答案都是错误的。消息很清楚-缺少区域设置。解决方案是添加适当的区域设置。您可以通过编辑 /etc/locale.gen文件来做到这一点,删除报告为缺少的区域设置前面的#符号,然后发出命令:

$ sudo locale-gen

这实际上将生成 /etc/locale.gen中指定的区域设置,因此不会显示消息。

在我的情况下,使用debian 8.6(Jessie),我必须更改设置:

/etc/ssh/ssh_config` for `#AcceptEnv LANG LC_*

sshd_config for#SendEnv LANG LC_*

然后重新启动ssh服务。

最后,我做到了:

locale-gen en_US.UTF-8dpkg-reconfigure locales

对于从macOS v10.13(High Sierra)上的iTerm2.app连接到DigitalOcean或其他云托管提供商并在某些命令上出现此错误的任何人:

perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
LANGUAGE = (unset),
LC_ALL = (unset),
LC_CTYPE = "UTF-8",
LANG = "en_US.UTF-8"
are supported and installed on your system.
perl: warning: Falling back to a fallback locale ("en_US.UTF-8").

这解决了我的问题:

在此输入图片描述

将缺少的语言环境添加到文件.

echo "export LANGUAGE=en_US.UTF-8
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8">>~/.bash_profile

然后获取您的.bash_profile文件:

source ~/.bash_profile

ArchLinux使用英国键盘和语言环境,我有以下错误:

perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
LANGUAGE = (unset),
LC_ALL = (unset),
LANG = "en_US.utf8"
  • /etc/profile中导出我的语言环境并没有修复它。

  • 然而,我确实通过编辑/etc/locale.gen来解决这个问题,还启用了perl期望找到的en_US.utf8语言环境,并运行local-gen

(我使用pac管理器,它使用了一大堆来自AURperl模块,所以在我的特定情况下重新安装perl会很麻烦。

对我来说,我通过编辑. bashrc文件,添加导出来修复这个错误。在最初的评论之后添加。

添加语言支持。

export LANGUAGE=en_US.UTF-8
export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
export LC_TYPE=en_US.UTF-8

将正确的语言环境添加到~/.bashrc~/.bash_profile/etc/environment等将解决问题,但不建议这样做,因为它覆盖了/etc/default/locale的设置,这充其量是令人困惑的,并且可能导致语言环境不被一致地应用。

相反,应该直接编辑/etc/default/locale,它可能看起来像这样:

LANG=en_US.UTF-8
LANGUAGE=en_US:en
LC_CTYPE=en_US

该更改将在您下次登录时生效。您可以通过像这样采购/etc/default/locale来在现有shell中获取新语言环境:

$ . /etc/default/locale

对于Ubuntu使用这个,

#export LANGUAGE=en_US.UTF-8
#export LC_ALL=en_US.UTF-8
#export LANG=en_US.UTF-8
#export LC_TYPE=en_US.UTF-8

它为我工作。

如果在您通过ssh连接到远程主机时出现此问题,那么远程系统可能缺少某些区域设置。我不打算重复如何安装和配置区域设置,因为其他答案已经很好地解释了这一点。

正如其他答案所指出的,ssh应该将本地计算机的语言环境传递给远程主机。例如,如果您设置了澳大利亚语言环境(例如en_AU.UFT-8),并且您正在连接到新设置的Ubuntu Server,该服务器仅附带en_US.UTF-8,那么您将收到此警告。

要解决这个问题,你有几个选择:

  1. 在远程主机上安装所需的区域设置,以便它们与客户端上配置的区域设置相匹配。

  2. 将SSH配置更改为没有传递客户端的环境变量。我不推荐这样做。

  3. 通过从文件. bashrc和朋友导出语言环境设置来覆盖远程计算机上的语言环境。

我们将设置重新启动后不取消设置的区域设置。

首先打开Bash文件并编辑它:

nano .bashrc

将这些行添加到文件中:

export LC_ALL="en_US.UTF-8"
export LANG="en_US.UTF-8"
export LANGUAGE="en_US.UTF-8"

通过重新加载Bash来激活更改:

source ~/.bashrc

测试结果:

locale

对于Debian用户,我在修改我的语言环境以更改机器语言后遇到了这个问题。这就是我所做的:

  1. 修改. bashrc:

    export LANG=fr_FR.UTF-8
    export LC_ALL=fr_FR.UTF-8
    
  2. 取消注释行fr_FR.UTF-8在文件etc/locale.gen->sudo locale-gen中生成丢失的包

  3. sudo update-locale

  4. sudo dpkg-reconfigure locales将我的语言环境配置为fr_FR.UTF-8

  5. etc/default/locale文件中添加额外的行:

    LANGUAGE=en_US.UTF-8
    LC_ALL=en_US.UTF-8
    LANG=en_US.UTF-8
    LC_TYPE=en_US.UTF-8
    
  6. 重启电脑,一切正常

LC_TYPE环境变量设置为默认语言环境语言“C”将有助于抑制此警告。

运行export LC_CTYPE="C"并尝试运行perl命令。

P. S:您需要在文件/etc/environment或文件/etc/default/locale中设置此变量以获得永久解决方案。

问题的根源

我通过ssh从一台机器登录到另一台机器时遇到了这种情况。远程机器没有我在本地机器上的区域设置文件。您可以禁用将区域设置从本地机器转发到远程机器(在文件/etc/ssh/sshd_config中删除AcceptEnv LANG LC_CTYPE …行)或安装区域设置(在这种情况下无需更改)。

安装

Fedora红帽LinuxCentOS上,我使用了

sudo dnf install langpacks-de

对于德语(de)语言包。我注销,登录,它起作用了。

搜索其他langpack与

dnf search langpacks-

更改/激活

列出我使用的可用语言环境

localectl list-locales

并设置一个新的

sudo localectl set-locale de_DE.utf8

每当我在最新的KaliLinux版本上运行Perl脚本(例如enum4linux)时,我都会遇到这个问题。

kali@kali:~$ lsb_release -a
No LSB modules are available.
Distributor ID:    Kali
Description:    Kali GNU/Linux Rolling
Release:    2020.3
Codename:    kali-rolling
kali@kali:~$

例如,

kali@kali:~$ enum4linux
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
LANGUAGE = (unset),
LC_ALL = (unset),
LC_ADDRESS = "ms_MY.UTF-8",
LC_NAME = "ms_MY.UTF-8",
LC_MONETARY = "ms_MY.UTF-8",
LC_PAPER = "ms_MY.UTF-8",
LC_IDENTIFICATION = "ms_MY.UTF-8",
LC_TELEPHONE = "ms_MY.UTF-8",
LC_MEASUREMENT = "ms_MY.UTF-8",
LC_TIME = "ms_MY.UTF-8",
LC_NUMERIC = "ms_MY.UTF-8",
LANG = "en_US.UTF-8"
are supported and installed on your system.
perl: warning: Falling back to a fallback locale ("en_US.UTF-8").
enum4linux v0.8.9 (http://labs.portcullis.co.uk/application/enum4linux/)
Copyright (C) 2011 Mark Lowe (mrl@portcullis-security.com)

看看给出的警告信息。

perl: warning: Falling back to a fallback locale ("en_US.UTF-8").

另外,请注意LC_ALL = (unset)

解决办法很简单。你所要做的就是设置它。

export LC_ALL=en_US.UTF-8

例如,

kali@kali:~$ export LC_ALL=en_US.UTF-8
kali@kali:~$

问题就解决了

kali@kali:~$ enum4linux
enum4linux v0.8.9 (http://labs.portcullis.co.uk/application/enum4linux/)
Copyright (C) 2011 Mark Lowe (mrl@portcullis-security.com)

对于永久解决方案,您可能希望将其添加到.bashrc文件中。

导出变量

$ export LANGUAGE=en_US.UTF-8
$ export LC_ALL=en_US.UTF-8
$ export LANG=en_US.UTF-8
$ export LC_CTYPE=en_US.UTF-8

下次跑步

$ sudo locale-gen
$ sudo dpkg-reconfigure locales

当您运行dpkg-reconfigure locales时,它会要求您选择语言环境,请选择en_US.UTF-8。如果您通过选择所有语言环境来运行此命令,则需要一些时间来配置。

perl -e exit
sudo localedef -i en_US -f UTF-8 en_DE.UTF-8
#                                   DE = German
# Use your country code en lieu of  DE


# The second "perl" should then not complain any more
perl -e exit


localectl list-locales # Just make sure it is OK

如果有人有一个带有Strato的服务器并试图弄清楚这一点,请检查/etc/profile。我重新生成语言环境和设置变量的时间太长,然后才发现该文件末尾有两行覆盖了我的语言环境设置。

对于Ubuntu服务器和Debian:

无需在bashrc中创建导出或处理dpkg-reconfiure。

只需将/etc/default/locale的内容替换为:

LC_ALL=en_US.UTF-8
LANG=en_US.UTF-8

我在/etc/locale.conf上的机器上设置了LC_COLLATE=C。我只是删除了那行,所以只设置了LANG=en_US.UTF-8(或您的等效物),不会再出现问题。

在Mac M1 Monterey上尝试过这些方法,但没有人工作。 我禁用该消息的快速方法: 打开终端->首选项->高级选项卡->取消选中在启动时设置locale环境变量

我有多个用户使用不同的shell,所以在我的案例中解决了这个问题:

  • 检查哪个shell
    echo $0
  • if bash
    echo "# Setting locale\nLC_CTYPE=en_US.UTF-8\nLC_ALL=en_US.UTF-8" >> .bashrc
  • 如果zsh
    echo "# Setting locale\nLC_CTYPE=en_US.UTF-8\nLC_ALL=en_US.UTF-8" >> .zshrc

Debian GNU/Linux11(靶心)

我在GCP中创建一个全新的VM实例后遇到了这个问题。

基本上,我刚刚运行了以下

$ sudo apt-get update
$ sudo apt-get upgrade

在这里我得到了错误

错误图像

perl: warning: Please check that your locale settings:
LANGUAGE = (unset),
LC_ALL = (unset),
LC_CTYPE = "UTF-8",
LC_TERMINAL = "iTerm2",
LANG = "C"
are supported and installed on your system.

这就是我如何修复它。

  • 首先安装locales
$ sudo apt-get install locales
  • 打开区域设置文件(使用您最喜欢的编辑器)。
$ sudo nano /etc/default/locale
  • 添加以下内容并保存。
LANGUAGE=en_US.UTF-8
LC_ALL=en_US.UTF-8
LANG=en_US.UTF-8
LC_CTYPE=en_US.UTF-8
  • 运行以下。
$ sudo localedef -i en_US -f UTF-8 en_US.UTF-8
  • 重新启动您的终端。

  • 运行命令以测试并通过ctrl + d关闭它。

$ perl

备注: 我创建了一个实例来测试我的解决方案以确保。如果它不适合你,请告诉我。

终端历史

我希望它能帮助你。