首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >locale.getpreferredencoding() -为什么要重置string.letters?

locale.getpreferredencoding() -为什么要重置string.letters?
EN

Stack Overflow用户
提问于 2014-05-20 00:53:04
回答 1查看 5.5K关注 0票数 20
代码语言:javascript
复制
>>> import string
>>> import locale
>>> string.letters
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
>>> locale.getpreferredencoding()
'UTF-8'
>>> string.letters
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'

有什么解决方法吗?

平台: Linux Python2.6.7和Python2.7.3似乎受到了影响,在Python3 (带有ascii_letters)中运行良好

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-20 01:12:38

注意:OP为解决这个问题所做的就是将encoding='UTF-8'传递给open调用。如果你遇到这个问题,只是想找一个修复方法,这是可行的。这篇文章的其余部分是强调为什么。

会发生什么?

正如卢卡斯所说,文档规定:

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

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

代码语言:javascript
复制
lowercase = 'abcdefghijklmnopqrstuvwxyz'
uppercase = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
letters = lowercase + uppercase

但是,当您调用getpreferredencoding()时,_locale模块会在使用以下代码在fixup_ulcase(void)中生成它们之后,通过调用PyDict_SetItemString(string, "letters", ulo);来覆盖它:

代码语言:javascript
复制
/* 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

代码语言:javascript
复制
  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使用不同的代码来获取区域设置,正如您可以看到的here

在Python 3中

在Python3中,可以看到heregetdefaultlocale不接受布尔型setlocale变量,也不调用setlocale本身。

票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23743160

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档