如何修复Perl中的本地设置警告

822
当我运行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").
如何解决?

当您检查了区域设置,就像错误消息告诉您的那样,发生了什么情况? - brian d foy
4
不必安装本地化设置,您也可以更改本地化设置。在我的Ubuntu电脑上,通过编辑“~/.pam_environment”为一个用户完成此操作。 - Janus Troelsen
在我的运行Ubuntu的ODROID-C1上,问题确实是~/.pam_environment文件。其中一些变量是es_US.UTF-8而不是en_US.UTF-8。谢谢。 - f1vefour
1
我在Cygwin\Babun上遇到了这个问题。只有重新安装perl才解决了它。 - Lucas Soares
48个回答

600

以下是如何在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

8
谢谢,我已经寻找解决这个问题的方法很长一段时间了。我一直认为这是我的Ubuntu服务器配置问题,似乎没有任何解决方法能够帮助我(所有的dkpg-reconfigure等)。 - Teemu Kurppa
8
由于 LC_ALL 覆盖了所有其他变量,我更愿意将 LANG=de_AT.UTF-8 和个别变量例如 LC_MESSAGES=en_US.UTF-8 进行设置。如果一个变量没有被设置,它会回退到 LANG。你也可以例如使用 unset LC_CTYPE 来强制将其回退到 LANG - David
4
将这些代码放入.bashrc文件中没有起作用,但是放到bash_profile文件中解决了问题!我不得不创建这个文件。 - john-jones
8
将这些行放入~/.bashrc,问题便得到了解决... 然后必须使用source ~/.bashrc重新加载... 谢谢 <3 - Enissay
5
谢谢,这在Mac OS X El Capitan下的ZSH和oh-my-zsh插件上运行良好,在~/.zshrc底部添加以下内容: LC_CTYPE=en_US.UTF-8 LC_ALL=en_US.UTF-8 - Valerio Schiavoni
显示剩余7条评论

549

你的操作系统不支持 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. 在客户端上修改您的环境,例如,使用命令 LANG=C ssh hunter2 而不是 ssh hunter2
  3. 如果您具有管理员权限,请通过在本地 /etc/ssh/ssh_config 文件中注释掉 SendEnv LANG LC_* 行来阻止 ssh 发送环境变量。 (感谢此答案。更多信息请参见OpenSSH的 Bug 1285。)

31
谢谢! 当我使用 git 连接到我的服务器时,出现了这个错误提示。通过使用 dpkg-reconfigure locales 添加 de_CH.UTF-8(在服务器上不受支持但在本地使用)后,错误信息消失了。 - Simon A. Eugster
96
我有很长一段时间遇到了这个问题,...最终从sshd_config中删除“AcceptEnv LANG LC_*”解决了它。感谢提示! - madc
2
@Greg Bacon,您是否也有需要在整个系统范围内设置环境变量的情况,例如通过创建/etc/environment文件?https://help.ubuntu.com/community/EnvironmentVariables#System-wide_environment_variables - fraxture
29
在Ubuntu(12.10)上,删除“AcceptEnv LANG LC_*”后,无需重新启动服务器。只需重新加载ssh配置即可:“service ssh reload”,这只需要花费一小部分时间,甚至不会导致当前的ssh会话终止。 - noamtm
5
在客户端系统上添加“export LC_ALL=C”然后“source ~/.bashrc”可以解决这个问题。 - EffectiveMatrix
显示剩余8条评论

260

如果你正在使用debootstrap创建rootfs,你需要生成locales。你可以通过运行以下命令来完成:

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

# then regenerate
sudo locale-gen

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


10
locale-gen 命令在 Debian stable 中不接受任何参数。相反,您需要编辑 /etc/locale.gen 文件并取消注释您想要的语言环境,然后运行 sudo locale-gen 命令。 - Sam Watkins
7
在 Debian 上,您可能需要先运行 $ echo en_US UTF-8 >> /etc/locale.gen - akhmed
3
在Gentoo(至少在这个系统上),locale-gen命令不带参数。它会从/etc/locale.gen文件中读取信息。 - Pistos
有些发行版不使用配置文件,需要执行以下命令:sudo locale-gen en_US.UTF-8 - Marc
2
@akhmed,你只需要取消注释#en_US.UTF-8 UTF-8这一行。 - Franklin Yu
显示剩余3条评论

184

使用:

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没有结果。

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


18
这个对我起作用。我只是将它放入我的 .bashrc 文件中。 - Anirudh Ramanathan
3
对我也起作用了。我只需要设置两个设置(LANGUAGE 和 LC_ALL),这些设置在 Perl 警告中未设置。 - laurent
2
在Debian上,local-gen仅处理在/etc/local.gen中取消注释的语言环境。您可能需要先执行echo en_US UTF-8 >> /etc/locale.gen - akhmed
1
LC_CTYPE 是什么? - mixel
应该是 LC_CTYPE - ᴍᴇʜᴏᴠ

170

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

在Debian或Ubuntu上,这意味着您需要执行以下操作:

$ sudo locale-gen
$ sudo dpkg-reconfigure locales

另请参阅locale-gen手册页


40
这里并没有解决问题。 - Somatik
7
运行 "dpkg-reconfigure locales" 命令解决了我的问题,在 Debian 7.1 版本中。 - newUserNameHere
5
dpkg-reconfigure locales 自己无法成功运行,会出现与最初试图修复的 perl 语言环境错误消息相同的问题!!! - matteo
10
这对我在Ubuntu 14.04上有用,尽管我必须首先使用“sudo locale-gen es_UY.UTF-8”添加缺失的语言环境。 - alf
2
@matteo 只有第一次出现错误时需要修复。再试一次,问题应该就解决了。 - Zero3
显示剩余2条评论

99

仅适用于 macOS 和 Mac OS X 用户

使用Git时,我也遇到了同样的警告。

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

输入图片描述


4
我尝试了所有其他的,但只有这个对我有用。我使用iTerm,并且它具有相同的字符编码选项。 - Michael Morrison
2
不幸的是,这会破坏ZSH(制表符停止工作)。 - Christian
1
这对于Mac OS完全起作用。顺便说一句,我在升级到macOS Sierra后就遇到了这个问题。而这确实为我解决了这个问题。 - Paulo Malvar
1
这解决了我的问题。在我更新到Mac OS X High Sierra后,这种情况开始发生。 - Lucian Irimie
2
是的,我使用iTerm。清除问题Mac系统设置修复了一些Mac崩溃,但在通过Mac / iTerm连接到我的长期稳定的CentOS服务器上运行Perl时引起了这个问题。禁用连接时自动设置区域设置即可解决此问题。iTerm->首选项->配置文件->终端->环境->自动设置区域变量。取消选中此选项,然后重新启动iTerm。 - joe

41

解决Ubuntu的问题很简单。您需要从头开始生成Locales,只需在命令行中运行以下命令:

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

这应该会创建本地化并重新配置它们。


这对我来说很好用,即使使用 pt_BR pt_BR.UTF-8 也没问题。
  • 谢谢。
- Marcos Freitas

40

将以下内容添加到/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

7
我收到了一条警告,说在/etc/environment中设置语言环境已经过时,应该改为在/etc/default/locale中设置。目前两种方式都能正常工作。 - joscarsson
1
应该是 LC_CTYPE - ᴍᴇʜᴏᴠ

26
在Debian上,经过大量搜索,这个做法起了作用。
首先:
sudo apt-get purge locales

那么:

sudo aptitude install locales

还有著名的:

sudo dpkg-reconfigure locales

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


5
еҸӘйңҖжү§иЎҢdpkg-reconfigure localesе‘Ҫд»ӨеҚіеҸҜпјҢеҰӮжһңдҪ жҳҜsudoз”ЁжҲ·пјҢйңҖиҰҒдҪҝз”ЁsudoжқғйҷҗжҲ–д»Ҙrootз”ЁжҲ·иә«д»Ҫжү§иЎҢгҖӮ然еҗҺж №жҚ®дҪ зҡ„shellзҺҜеўғйҖүжӢ©еҗҲйҖӮзҡ„localeеҚіеҸҜгҖӮ - mknaf
7
dpkg-reconfigure locales 应该就足够了。如果你已经尝试过100次并且在网络上搜索过,但问题仍未得到解决,请尝试上述方法。然后回来点赞这个答案 :) - tkjef
如果您的系统已经崩溃到需要清除并重新安装软件包才能解决问题的地步,那么您可能还有其他更严重的问题。 - tripleee

26

我现在正在使用这个:

$ 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

这在我的Ubuntu 15.04上运行良好,非常感谢。 - Goke Obasa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接