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

How to fix a locale setting warning from Perl?

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

1
2
3
4
5
6
7
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").

我该怎么修?


以下是如何在Mac OS Lion(10.7)或Cygwin(Windows 10)上解决此问题:

在主机上的bashrc或bash_概要文件中添加以下行:

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

如果使用zsh,请编辑zshrc:

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


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

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

1
2
3
4
5
6
7
8
9
% 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通常包含

1
AcceptEnv LANG LC_*

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

如果不需要完整的区域设置,警告会提示您如何抑制它:

1
2
% env LANG=C perl -e exit
%

或用巴什:

1
2
$ LANG=C perl -e exit
$

对于永久修复,请选择

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

  • 如果使用debootstrap创建rootfs,则需要生成区域设置。您可以通过运行:

    1
    2
    3
    4
    5
    # (optional) enable missing locales
    sudo nano /etc/locale.gen

    # then regenerate
    sudo locale-gen

    此提示来自:https://help.ubuntu.com/community/xen


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

    在Debian或Ubuntu上,这意味着你需要

    1
    2
    $ sudo locale-gen
    $ sudo dpkg-reconfigure locales

    另请参见man locale-gen。


    用途:

    1
    2
    3
    4
    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

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

    重要!这是暂时的解决办法。它必须为每个会话运行。


    仅限MacOS和Mac OS X用户

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

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

    enter image description here


    这是Ubuntu中的简单修复。必须从头生成区域设置,从命令行运行以下命令:

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

    这应该创建区域设置,然后重新配置它们。


    我现在用这个:

    1
    2
    3
    4
    $ cat /etc/environment
    ...
    LC_ALL=en_US.UTF-8
    LANG=en_US.UTF-8

    然后注销ssh会话并再次登录。

    老回答:

    只有这一点帮助了我:

    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    $ 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


    /etc/environment中添加以下内容,修复了debian和ubuntu上的问题(当然,修改以匹配您要使用的语言环境):

    1
    2
    3
    4
    LANGUAGE=en_US.UTF-8
    LC_ALL=en_US.UTF-8
    LANG=en_US.UTF-8
    LC_TYPE=en_US.UTF-8


    在Debian搜索了很多次之后,这就成功了。

    第一:

    1
    sudo apt-get purge locales

    然后:

    1
    sudo aptitude install locales

    著名的:

    1
    sudo dpkg-reconfigure locales

    这将RID区域设置系统,然后重新安装区域设置,并将libc6从2.19降级到2.13,这就是问题所在。然后再次配置区域设置。


    对于Ubuntu,使用这个,

    1
    2
    3
    4
    #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

    为我工作。


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

  • 保留您的文件/etc/ssh/sshd配置原件

  • 穿上你的~/.bash_档案

    1
    2
    export LANG="en_US"
    export LC_ALL=$LANG.UTF-8
  • 1
    dpkg-reconfigure locales

    并选择"en-u-us.utf-8"


  • 您需要在/etc/default/locale中适当地配置区域设置,注销、登录,然后运行常规命令。

    1
    2
    3
    4
    5
    6
    root@host:~# echo -e 'LANG=en_US.UTF-8
    LC_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


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

    解决方案:

    试试这个(UK_A.utf-8是我当前的语言环境。编写您的区域设置,例如en-u.utf-8!)

    1
    sudo locale-gen uk_UA.UTF-8

    这个。

    1
    sudo dpkg-reconfigure locales


    1
    sudo nano /etc/locale.gen

    取消对要使用的区域设置的注释(例如,en_US.UTF-8 UTF-8):

    然后运行:

    1
    sudo /usr/sbin/locale-gen

    来源:http://people.debian.org/~schultmc/locales.html


    对于我来说,我修复了编辑.bashrc文件add export时的错误。在初始注释后添加。

    添加语言支持。

    1
    2
    3
    4
    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

    Kind Regads


    对于从MacOS High Sierra上的iterm2.app连接到DigitalOcean或其他云主机提供商并在某些命令上收到此错误的任何人:

    1
    2
    3
    4
    5
    6
    7
    8
    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").

    这解决了我的问题:

    enter image description here

    我知道这条线很旧,但也许有人会发现它很有用。我知道这有多烦人。


    将正确的区域设置添加到~/.bashrc~/.bash_profile/etc/environment等将解决此问题,但不建议这样做,因为它会覆盖/etc/default/locale中的设置,这在最好的情况下是混淆的,并且可能导致区域设置在最坏的情况下不被一致应用。

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

    1
    2
    3
    LANG=en_US.UTF-8
    LANGUAGE=en_US:en
    LC_CTYPE=en_US

    更改将在下次登录时生效。您可以通过如下方式获取现有shell中的新区域设置:

    1
    $ . /etc/default/locale


    这是一个快速的答案。我们将设置在重新启动后未重置的区域设置。首先打开bash文件并对其进行编辑:

    1
    nano .bashrc

    将这些行添加到文件中:

    1
    2
    3
    export LC_ALL="en_US.UTF-8"
    export LANG="en_US.UTF-8"
    export LANGUAGE="en_US.UTF-8"

    通过重新加载bash激活更改:

    1
    source ~/.bashrc

    试验结果:

    1
    locale


    在zsh ohmyzsh中,我在.zshrc中添加了这个:

    1
    2
    3
    4
    5
     # 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

    重新打开一个新的标签页,然后ssh输入,为我工作:)


    按照接受的答案:

    LANG=C ssh hunter2.

    lc_all=c ssh猎人2

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


    LC_ALL="en_GB.utf8"添加到/etc/environment并重新启动。这就是全部。


    像往常一样,魔鬼在细节上…

    在Mac OS X v10.7.5(lion)上,为了修复某些django错误,在我的~/.bash_profile中,我设置了:

    1
    2
    3
    4
    5
    6
    7
    8
    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!我只是通过改变

    1
    export LANG=en_EN.UTF-8

    1
    export LANG=en_US.UTF-8

    在我的案例中,对于Debian8.6,我必须更改以下设置:

    /etc/ssh/ssh_config用于#AcceptEnv LANG LC_*

    sshd_config用于#SendEnv LANG LC_*

    然后重新启动ssh服务。

    最后,做了

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


    将缺少的区域设置添加到.bash_配置文件

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

    然后找到你的.bash_简介

    1
    source ~/.bash_profile

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

    1
    2
    3
    4
    5
    LANGUAGE = (unset),
    LC_ALL = (unset),
    LC_PAPER ="ro_RO.UTF-8",
    LC_ADDRESS ="ro_RO.UTF-8",
    ....

    解决方案是:

    1
    sudo locale-gen ro_RO.UTF-8

    另一个与Git相关的答案:

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


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


    对于我来说,在Ubuntu 16.04(Xenial Xerus)上,以下内容起作用:

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

    然后重新启动…


    以前所有的答案都是错误的。消息是明确的-缺少区域设置。解决方案是添加适当的区域设置。通过编辑/etc/locale.gen文件,删除报告为丢失的区域设置前面的符号,然后发出命令:

    1
    $ sudo locale-gen

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


    在使用UK键盘/区域设置的ARCHLinux中,我遇到了以下错误:

    1
    2
    3
    4
    5
    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希望找到并运行local-genen_US.utf8区域。

    (我使用的是pac manager,它使用了aur中的一大堆perl模块,因此在我的特定情况下重新安装perl会很麻烦)


    默认情况下,ssh覆盖lc区域设置变量。见/etc/ssh/sshd_config

    1
    AcceptEnv LANG LC_*

    所以可能需要在本地shell中设置这些变量。


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


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

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

    要解决此问题,您有几个选项:

  • 在远程主机上安装所需的区域设置,使它们与客户机上配置的区域设置相匹配。

  • 将ssh配置更改为不传递客户端的环境变量。我不推荐这个。

  • 通过从.bashrc和friends导出区域设置来覆盖远程计算机上的区域设置。


  • 尝试重新安装:

    1
    localess apt-get install --reinstall locales

    了解有关如何更改默认区域设置的详细信息