主要用到locale模块,以下为windows上的演示
print(locale.getpreferredencoding())
print(locale.getdefaultlocale())
#输出
cp936
('zh_CN', 'cp936')
- CP936其实就是GBK,IBM在发明Code Page的时候将GBK放在第936页,所以叫CP936。
扩展
但是在某些系统中,当您调用时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)
避免方式
locale.getpreferredencoding(False)
网友评论