getPreredencode()-为什么这会重设字符串呢?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (22)
>>> import string
>>> import locale
>>> string.letters
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
>>> locale.getpreferredencoding()
'UTF-8'
>>> string.letters
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'

有什么解决办法吗?

平台:LinuxPython2.6.7和Python2.7.3似乎受到影响,在Python 3中运行良好(与ascii_letters)

提问于
用户回答回答于

注意:OP解决问题的方法是传递encoding='UTF-8'open调用。如果你遇到这个问题,并且只是在寻找解决这个问题的方法。这篇文章的其余部分强调了为什么

怎么了

文件指出:

在某些系统上,有必要调用setlocale()来获取用户首选项

最初,string.letters被设置为返回lowercase + uppercase

lowercase = 'abcdefghijklmnopqrstuvwxyz'
uppercase = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
letters = lowercase + uppercase

但是,当调用getpreferredencoding()_locale模块时,该模块PyDict_SetItemString(string, "letters", ulo);fixup_ulcase(void)使用以下命令生成它们之后通过调用覆盖该模块:

/* create letters string */
n = 0;
for (c = 0; c < 256; c++) {
    if (isalpha(c))
        ul[n++] = c;
}
ulo = PyString_FromStringAndSize((const char *)ul, n);
if (!ulo)
    return;
if (string)
    PyDict_SetItemString(string, "letters", ulo);
Py_DECREF(ulo);

反过来,这被称为PyLocale_setlocale其中,确实setlocale,这是由getpreferredencoding- 代码在这里调用http://hg.python.org/cpython/file/07a6fca7ff42/Lib/locale.py#l612

  def getpreferredencoding(do_setlocale = True):
        """Return the charset that the user is likely using,
        according to the system configuration."""
        if do_setlocale:
            oldloc = setlocale(LC_CTYPE)
            try:
                setlocale(LC_CTYPE, "")
            except Error:
                pass
            result = nl_langinfo(CODESET)
            setlocale(LC_CTYPE, oldloc)
            return result
        else:
            return nl_langinfo(CODESET)

我如何避免它?

尝试 getpreferredencoding(False)

为什么不在Windows中发生?

Windows使用不同的代码获取语言环境,如在此处看到的。

在Python 3中

在Python 3中,getdefaultlocale不接受布尔setlocale变量,也不会调用setlocale本身,如在此处所见。

扫码关注云+社区

领取腾讯云代金券