>>> import string
>>> import locale
>>> string.letters
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
>>> locale.getpreferredencoding()
'UTF-8'
>>> string.letters
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
有什么解决方法吗?
平台: Linux Python2.6.7和Python2.7.3似乎受到了影响,在Python3 (带有ascii_letters
)中运行良好
发布于 2014-05-20 01:12:38
注意:OP为解决这个问题所做的就是将encoding='UTF-8'
传递给open
调用。如果你遇到这个问题,只是想找一个修复方法,这是可行的。这篇文章的其余部分是强调为什么。
会发生什么?
正如卢卡斯所说,文档规定:
在某些系统上,需要调用setlocale()来获取用户首选项
最初,string.letters设置为返回lowercase + uppercase
lowercase = 'abcdefghijklmnopqrstuvwxyz'
uppercase = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
letters = lowercase + uppercase
但是,当您调用getpreferredencoding()
时,_locale
模块会在使用以下代码在fixup_ulcase(void)
中生成它们之后,通过调用PyDict_SetItemString(string, "letters", ulo);
来覆盖它:
/* 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使用不同的代码来获取区域设置,正如您可以看到的here。
在Python 3中
在Python3中,可以看到here,getdefaultlocale
不接受布尔型setlocale变量,也不调用setlocale本身。
https://stackoverflow.com/questions/23743160
复制相似问题