其中 Py_FileSystemDefaultEncoding 在 python 源代码中设置

and*_*ndy 4 python locale python-2.7

我很好奇 python 源代码如何设置 Py_FileSystemDefaultEncoding 的值。我收到了一件奇怪的事情。

由于python doc about sys.getfilesystemencoding() 说:

在 Unix 上,根据 nl_langinfo(CODESET) 的结果,编码是用户的偏好,如果 nl_langinfo(CODESET) 失败,则为 None。

我使用 python 2.7.6

``

>>>import sys
>>>sys.getfilesystemencoding()
>>>'UTF-8'
>>>import locale
>>>locale.nl_langinfo(locale.CODESET)
>>>'ANSI_X3.4-1968'
Run Code Online (Sandbox Code Playgroud)

```
这里的问题是:为什么 getfilesystemencoding() 的值与 locale.nl_landinfo() 的值不同,因为文档说 getfilesystemencoding() 是从 locale.nl_landinfo() 派生的。

这是我终端中的语言环境命令输出:

LANG=en_US.UTF-8
LANGUAGE=en_US:en
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC=zh_CN.UTF-8
LC_TIME=zh_CN.UTF-8
LC_COLLATE="en_US.UTF-8"
LC_MONETARY=zh_CN.UTF-8
LC_MESSAGES="en_US.UTF-8"
LC_PAPER=zh_CN.UTF-8
LC_NAME=zh_CN.UTF-8
LC_ADDRESS=zh_CN.UTF-8
LC_TELEPHONE=zh_CN.UTF-8
LC_MEASUREMENT=zh_CN.UTF-8
LC_IDENTIFICATION=zh_CN.UTF-8
LC_ALL=
Run Code Online (Sandbox Code Playgroud)

jfs*_*jfs 5

总结:sys.getfilesystemencoding()行为如文档所示。混淆是由于setlocale(LC_CTYPE, "")(用户的偏好)和默认 C 语言环境之间的差异造成的。


该脚本始终以默认的 C 语言环境开始:

>>> import locale
>>> locale.nl_langinfo(locale.CODESET)
'ANSI_X3.4-1968'
Run Code Online (Sandbox Code Playgroud)

getfilesystemencoding()使用用户的语言环境:

>>> import sys
>>> sys.getfilesystemencoding()
'UTF-8'
>>> locale.setlocale(locale.LC_CTYPE, '')
'en_US.UTF-8'
>>> locale.nl_langinfo(locale.CODESET)
'UTF-8'
Run Code Online (Sandbox Code Playgroud)

空字符串作为语言环境名称根据用户对适当环境变量的选择来选择语言环境

$ LC_CTYPE=C python -c 'import sys; print(sys.getfilesystemencoding())'
ANSI_X3.4-1968
$ LC_CTYPE=C.UTF-8 python -c 'import sys; print(sys.getfilesystemencoding())'
UTF-8
Run Code Online (Sandbox Code Playgroud)

我在哪里可以找到有关设置 Py_FileSystemDefaultEncoding 的源代码。

Python 2.7 的源代码中有两个地方:


你能给我一些如何在python源代码中搜索一些关键字的建议吗?

要找到这些地方: