How to fix a locale setting warning from Perl?

xain Source

When I run perl, I get the warning:

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").

How do I fix it?

perllocale

Answers

answered 8 years ago Paul Tomblin #1

This generally means you haven't properly set up locales on your Linux box.

On Debian or Ubuntu, that means you need to do

$ sudo locale-gen
$ sudo dpkg-reconfigure locales

See also man locale-gen.

answered 8 years ago Greg Bacon #2

Your OS doesn't know about en_US.UTF-8.

You didn't mention a specific platform, but I can reproduce your problem:

% 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").

My guess is you used ssh to connect to this older host from a newer desktop machine. It's common for /etc/ssh/sshd_config to contain

AcceptEnv LANG LC_*

which allows clients to propagate into new sessions the values of those environment variables.

The warning gives you a hint about how to squelch it if you don't require the full-up locale:

% env LANG=C perl -e exit
%

or with bash:

$ LANG=C perl -e exit
$ 

For a permanent fix, choose one of

  1. On the older host, set the LANG environment variable in your shell's initialization file.
  2. Modify your environment on the client side, e.g., rather than ssh hunter2, use the command LANG=C ssh hunter2.
  3. If you have admin rights, stop ssh from sending the environment variables by commenting out the SendEnv LANG LC_* line in the local /etc/ssh/ssh_config file. (Thanks to this answer. See Bug 1285 for OpenSSH for more.)

answered 7 years ago Allen Bargi #3

Here is how to solve it on Mac OS Lion (10.7) or Cygwin (Windows 10):

Add the following lines to your bashrc or bash_profile on the host machine:

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

If you are using zsh, edit zshrc:

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

answered 6 years ago Marc #4

If you are creating a rootfs using debootstrap you will need to generate the locales. You can do this by running:

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

# then regenerate
sudo locale-gen

This tip comes from, https://help.ubuntu.com/community/Xen

answered 5 years ago Inder Kumar Rathore #5

For macOS & Mac OS X users only

I was getting the same warning while using Git

To resolve this warning Uncheck the Set locale environment variable on startup option and restart your terminal. Below screen shot represents my terminal settings.

enter image description here

answered 5 years ago joscarsson #6

Adding the following to /etc/environment fixed the problem for me on Debian and Ubuntu (of course, modify to match the locale you want to use):

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

answered 5 years ago Alex Kosenkov #7

Following the accepted answer:

LANG=C ssh hunter2.

LC_ALL=C ssh hunter2

on the client side did the trick for me.

answered 4 years ago artemn #8

Use:

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

It works for Debian. I don't know why - but locale-gen had not results.

Important! It's a temporary solution. It has to be run for each session.

answered 4 years ago glarrain #9

You need to configure locale appropriately in /etc/default/locale, logout, login, and then run the regular commands

[email protected]:~# echo -e 'LANG=en_US.UTF-8\nLC_ALL=en_US.UTF-8' > /etc/default/locale
[email protected]:~# exit
[email protected]:~$ ssh [email protected]
[email protected]:~# locale-gen en_US.UTF-8
[email protected]:~# dpkg-reconfigure locales

answered 4 years ago EpicVoyage #10

If you are running a chroot in CentOS, try manually copying /usr/lib/locale.

answered 4 years ago Adrian W #11

Another Git-related answer:

The source of the problem might be the Git server. If all else fails, try doing dpkg-reconfigure locales (or whatever is appropriate for your distribution) on the server.

Credits: This tip is from Fixing the pesky perl: warning: Setting locale failed on Ubuntu Server and solved the problem in my case.

answered 4 years ago Thomas Jensen #12

sudo nano /etc/locale.gen

Uncomment the locales you want to use (e.g. en_US.UTF-8 UTF-8):

Then run:

sudo /usr/sbin/locale-gen

Source: http://people.debian.org/~schultmc/locales.html

answered 4 years ago Luca Bonavita #13

As always, the devil is in the detail...

On Mac OS X v10.7.5 (Lion), to fix some Django error, in my ~/.bash_profile I've set:

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

And in turn for a long time I got that warning when using Perl.

My bad! As I've realized much later, my system is en_US.UTF-8! I fixed it simply by changing from

export LANG=en_EN.UTF-8

to

export LANG=en_US.UTF-8

answered 4 years ago tkjef #14

on Debian after much searching this did the trick.

first:

sudo apt-get purge locales

then:

sudo aptitude install locales

and the famous:

sudo dpkg-reconfigure locales

This rids the system of locales, then re-installs locales and downgrades libc6 from 2.19 to 2.13 which is the issue. Then configures locales again.

answered 4 years ago Rodislav Moldovan #15

In my case, this was the output:

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

The solution was:

sudo locale-gen ro_RO.UTF-8

answered 4 years ago jfreak53 #16

It is simple fix in Ubuntu. You have to generate the Locales from scratch, running the following commands from the command line:

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

This should create the locales and then re-configure them.

answered 3 years ago warvariuc #17

I am now using this:

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

Then log out of SSH session and log in again.

Old answer:

Only this helped me:

$ 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

answered 3 years ago Samda #18

I have spent a lot of time trying to solve this problem, and at last I found it in Fixing the locale problem in Debian - mirror.

answered 3 years ago zires #19

Add LC_ALL="en_GB.utf8" to /etc/environment and reboot. That's all.

answered 3 years ago user2190787 #20

ssh overwrites LC locale variables by default. See /etc/ssh/sshd_config:

AcceptEnv LANG LC_*

So maybe you need to set these variables in your local shell.

answered 3 years ago Володимир Вонс #21

Try to reinstall:

localess apt-get install --reinstall locales

Read more in How to change the default locale

answered 3 years ago dsandrade #22

If you use Mac OS X v10.10 (Yosemite) or above to connect in your server Linux, you can try these steps.

  1. Keep your file /etc/ssh/sshd-config original

  2. Put on your ~/.bash_profile

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

    dpkg-reconfigure locales
    

    And select "en_US.UTF-8"

answered 2 years ago bogdanvlviv #23

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

Solution:

Try this (uk_UA.UTF-8 is my current locale. Write your locale, for example en_US.UTF-8 !)

sudo locale-gen uk_UA.UTF-8

and this.

sudo dpkg-reconfigure locales

answered 2 years ago Craig Ringer #24

If you don't care about the locale issue, you can set PERL_BADLANG=0. Of course, this could result in incorrect localisation.

answered 2 years ago Aleksandar Pavić #25

For me, on Ubuntu 16.04 (Xenial Xerus) the following worked:

[email protected]:~#locale-gen en_GB.UTF-8
[email protected]:~#localectl set-locale LANG=en_GB.UTF-8,LC_ALL=en_GB.UTF-8

Then reboot...

answered 2 years ago Joseph Briggs #26

With zsh ohmyzsh I added this to the .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

By removing the line export LANG=en_US.UTF-8

Reopened a new tab and SSHed in, worked for me :)

answered 1 year ago Matthias Hryniszak #27

All the previous answers are wrong. The message is clear - missing locale. The solution is to add the appropriate locale. You do that by editing the /etc/locale.gen file, remove the # sign in front of the locale being reported as missing and then issuing the command:

$ sudo locale-gen

This will actually generate the locales specified in /etc/locale.gen and therefore the message will not be shown.

answered 1 year ago 張祐榕 #28

in my case, with debian8.6, i had to change settings in:

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

and sshd_config for #SendEnv LANG LC_*

then restart ssh service.

at last, did

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

answered 10 months ago Ogalb #29

For anyone connecting to DigitalOcean or some other Cloud hosting provider from the iTerm2.app on MacOS High Sierra and getting this error on some commands:

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").

This fixed the problem for me:

enter image description here

I know this thread is old but maybe somebody will find this useful. I know how annoying this can be.

answered 9 months ago Parinda Rajapaksha #30

Add missing locales to .bash_profile

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

Then source your .bash_profile

source ~/.bash_profile

answered 9 months ago Stuart Cardall #31

In Arch Linux using a UK keyboard / locale I had the following error:

perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
LANGUAGE = (unset),
LC_ALL = (unset),
LANG = "en_US.utf8"
  • Exporting my locales in /etc/profile didn't fix it.

  • I did however fix this by editing /etc/locale.gen & also enabling
    the en_US.utf8 locale that perl expected to find & running local-gen.

(I use pac-manager which uses a whole bunch of perl modules from AUR so reinstalling perl in my particular case would be a nuisance)

answered 8 months ago LandiLeite #32

for me I fix this error editing the .bashrc file add export. Add after initial comments.

Add language suport.

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,

answered 6 months ago Nuvanda #33

Adding the correct locale to ~/.bashrc, ~/.bash_profile, /etc/environment and the like will solve the problem, however it is not recommended, as it overrides the settings from /etc/default/locale, which is confusing at best and may lead to the locales not being applied consistently at worst.

Instead, one should edit /etc/default/locale directly, which may look something like this:

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

answered 4 months ago Amjith #34

For Ubuntu use this,

#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

Worked for me.

answered 4 months ago lanoxx #35

If this problem occurs while you are connecting via ssh to a remote host then it is possible that the remote system is missing certain locales. I am not going to repeat how to install and configure locales as this has been well explained by other answers already.

As other answers have pointed out ssh should be passing your local computers locales to the remote host. For example, if you have Australian locales set (e.g. en_AU.UFT-8), and you are connecting to a newly setup Ubuntu Server which only comes with en_US.UTF-8 then you will receive this warning.

To solve this problem you have several options:

  1. Install the required locales on the remote host such that they match locales configured on your client.

  2. Change the SSH configuration to NOT pass your clients' environment variables. I would not recommend this.

  3. Override the locale on your remote machine by exporting locale settings from .bashrc and friends.

comments powered by Disqus