apt-get 警告:不支持地区设置 en_US.utf8。

每次我使用apt-get更新系统时,都会出现这个错误。这个错误是什么意思?有没有办法可以纠正它? (我正在运行Ubuntu 11.10)

1问题显然是小写的 "utf8"。"sudo update-locale LANG=en_US.UTF-8" 应该能解决问题。 - stolsvik
我想补充一下,当在Mint上进行更新时,如果MySQL服务被禁用(如果已安装),我也会遇到这个“错误”。启用它后,问题就消失了。 - not2qubit
5个回答

通常,这个错误意味着你可能在不同的语言(区域设置)之间进行了切换,并且某些原因导致了错误的发生。
你可以尝试重新生成你的语言列表,使用以下命令:
sudo 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.

然后使用以下命令重置您的本地区域设置:
sudo update-locale LANG=en_US.UTF-8

即使用上述输出中的一个Locale值


在我的情况下,问题是/usr/share/initramfs-tools/hooks/root_locale期望在/usr/lib/locale目录中看到单独的区域设置目录,但locale-gen默认配置为生成一个存档文件。
我通过运行以下命令修复了这个问题:
sudo locale-gen --purge --no-archive

4根据Matt的解释,locale-gen命令是正确的,由于libc的大小限制,所有的区域设置不再存储在单独的目录中。"locale-gen是一个程序,它读取/etc/locale.gen文件,并为所选择的本地化配置文件调用localedef。"警告:对于xx_XX.utf8区域设置的不支持已经通过他的答案得到修复 :) +1 - xtrchessreal
2这个答案在2019年对于Linux Mint 19仍然有效,它基于Ubuntu Bionic。 - Eiver
这里又是一个+1,这次是为了安装全新的Focal Fossa服务器。我正在尝试安装Foreman,并在运行PostgreSQL设置步骤时遇到了这个问题。 - Sera H

问题可能是由于在"utf8"而不是"UTF8"中的小写字母导致的?
Warning: No support for locale: en_US.utf8

这段代码似乎解决了问题。
> sudo update-locale LANG=en_US.UTF-8
> echo $LANG
en_US.UTF-8

理论上也可以在本地语言设置中进行。

enter image description here

然后,“应用于整个系统”也应该更新本地内容。

我看到你正在运行ubuntu11.10(oneric)@2011,尽管上面的答案可能已经解决了该版本的问题,但警告消息仍然存在,并且提供的答案在我的情况下没有解决问题:

从Ubuntu 14.04(trusty [Mint 17.1 ISO])的全新安装,并升级到ubuntu 18.04(bionic [Mint 19.3]),总共应用了6个升级。我忽略了持续的警告消息,因为它对我的系统运行或我对内核所做的任何更改都没有影响。

然而,我感到困惑,我找到了以下内容:

经仔细检查,我发现文件位于/usr/share/initramfs-tools/hooks/root_locale(日期为2011年3月11日!),我推断该文件由../hook-functions执行(在先前提到的Ubuntu releases found here和更多中找到的initramfs-tools),在我的情况下,警告的来源在这里:


[ -r /etc/default/locale ] && . /etc/default/locale

[ -z "$ROOT_LOCALE" ] && ROOT_LOCALE=`echo $LANG | sed -e 's/UTF/utf/' -e 's/utf-8/utf8/'`

if [ -n "$ROOT_LOCALE" ] && [ -d /usr/lib/locale/$ROOT_LOCALE ]; then
        [ "${verbose}" = "y" ] && echo "Adding locale: $ROOT_LOCALE"
        mkdir -p "$DESTDIR/usr/lib/locale"
        cp -r /usr/lib/locale/$ROOT_LOCALE "$DESTDIR/usr/lib/locale"
        echo "ROOT_LOCALE=$ROOT_LOCALE" > $CONF
        echo "export ROOT_LOCALE" >> $CONF
        echo "export FSTYPE" >> $CONF
else
        echo "Warning: No support for locale: $ROOT_LOCALE" >&2
fi


请注意,此脚本明确引用了/usr/lib/locale/en_US.utf8,在我的情况下解析失败。
在发布这个答案的时候,上面提供的其他解决方案都没有解决utf8小写的问题,特别是在ubuntu 14 > 20中,locale-gen只是将/etc/locale.gen中的每一行解析给localedef,参见Ubuntu man pages locale-gen from 16.04 to 20.04(并且没有上面提到的任何选项),而locale.gen也没有一个使用utf8小写的条目。
要解决这个问题:
首先,检查您在Ubuntu/Debian基于发行版中使用的语言: echo $LANG 然后,将下面的en_US更改为您的语言(例如fr_FRcd /usr/lib/locale

localedef -f UTF-8 -i en_US ./en_US.utf8

这将创建以下结构:

ls /usr/lib/locale/en_US.utf8/

LC_ADDRESS LC_IDENTIFICATION LC_MONETARY LC_PAPER LC_COLLATE LC_MEASUREMENT LC_NAME LC_TELEPHONE LC_CTYPE LC_MESSAGES LC_NUMERIC LC_TIME

注意1:在Ubuntu版本16.04 > 20.04中,locale-gen(shell脚本)和dpkg-reconfigure locales(调用localedef)只解析/etc/locale.gen,而您的发行版可能提供不同的功能。

注意2:我不知道___/usr/share/initramfs-tools/hooks/root_locale___是从哪里来的,因为在任何上述的版本中都找不到它,我只能推测它可能是Mint 17.1的一部分或者残留物,你的发行版可能不同。


额.. 在我的机器上既没有 /usr/share/initramfs-tools/hooks/root_locale 也没有 /usr/lib/locales。你的回答真的是关于Ubuntu吗,还是你在其他Linux平台上? - Gunnar Hjalmarsson
修复引用和拼写错误后,过于快速发布 - hillbllie
Gunnar,我承认在/usr/lib/locale上有个打字错误,但正如Matt(2012)之前所述,并由Anwar(2014)进行了修饰,/usr/share/initramfs-tools/hooks/root_locale存在于他的发行版中 - 没有说明是哪个版本 - 我假设您的评论已经得到满足。请注意,提供的答案都不适用于Ubuntu 14及以后的版本(我无法再往前回溯)。请注意:locale-gen、update-locale和dpkg-reconfigure locales不会创建以小写.utf8结尾的$LANG值,也不会创建像我示例中显示的目录结构。 - hillbllie

重新安装`locales`对我有效。
sudo apt reinstall locales

在运行上述命令之前,我会看到这个。
$ locale -a                    
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_COLLATE to default locale: No such file or directory
C
C.UTF-8
POSIX
$ sudo dpkg-reconfigure locales
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
...
Generating locales (this might take a while)...
  en_AG.UTF-8...[error] cannot open locale definition file `en_GB': No such file or directory
 done
  en_AU.UTF-8...[error] cannot open locale definition file `en_AU': No such file or directory
...

重新安装了 locales 后,我看到了正确的输出。
$ locale -a                       
C
C.UTF-8
...
en_US.utf8
...
$ sudo dpkg-reconfigure locales         
Generating locales (this might take a while)...
...
  en_US.UTF-8... done
...
Generation complete.