为什么locale.getpreferredencoding()返回'ANSI_X3.4-1968'而不是'UTF-8'? [英] Why does locale.getpreferredencoding() return 'ANSI_X3.4-1968' instead of 'UTF-8'?

查看:409
本文介绍了为什么locale.getpreferredencoding()返回'ANSI_X3.4-1968'而不是'UTF-8'?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

每当我尝试使用open(file_name, encoding='utf-8')读取UTF-8编码的文本文件时,总是会收到一条错误消息,提示ASCII编解码器无法解码某些字符(例如,使用for line in f: print(line)时)

Whenever I try to read UTF-8 encoded text files, using open(file_name, encoding='utf-8'), I always get an error saying ASCII codec can't decode some characters (eg. when using for line in f: print(line))

Python 3.5.3 (default, Jan 19 2017, 14:11:04)
[GCC 6.3.0 20170118] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import locale
>>> locale.getpreferredencoding()
'ANSI_X3.4-1968'
>>> import sys
>>> sys.getfilesystemencoding()
'ascii'
>>>

locale命令打印:

locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE=en_HK.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=

推荐答案

我遇到了类似的问题.对我而言,最初未设置环境变量LANG(您可以通过运行env进行检查)

I had a similar problem. For me, initially the environtment variable LANG was not set (you can check this by running env)

$ python3 -c 'import locale; print(locale.getdefaultlocale())'
(None, None)
$ python3 -c 'import locale; print(locale.getpreferredencoding())'
ANSI_X3.4-1968

对我来说可用的语言环境是(在新的Ubuntu 18.04 Docker映像上):

The available locales for me was (on a fresh Ubuntu 18.04 Docker image):

$ locale -a
C
C.UTF-8
POSIX

所以我选择了utf-8:

So i picked the utf-8 one:

$ export LANG="C.UTF-8"

然后一切正常

$ python3 -c 'import locale; print(locale.getdefaultlocale())'
('en_US', 'UTF-8')
$ python3 -c 'import locale; print(locale.getpreferredencoding())'
UTF-8


如果您选择了一个不可用的语言环境,例如


If you pick a locale that is not avaiable, such as

export LANG="en_US.UTF-8"

它将起作用:

$ python3 -c 'import locale; print(locale.getdefaultlocale())'
('en_US', 'UTF-8')
$ python3 -c 'import locale; print(locale.getpreferredencoding())'
ANSI_X3.4-1968

这就是locale给出错误消息的原因:

and this is why locale is giving the error messages:

locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory

这篇关于为什么locale.getpreferredencoding()返回'ANSI_X3.4-1968'而不是'UTF-8'?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆