Windows Python:使用语言环境模块更改编码

时间:2014-12-12 05:20:18

标签: python encoding utf-8 locale setlocale

使用Python 2.7

我正在编写一个抽象的Web scraper,在显示(打印)某些字符时遇到问题。

我从打印包含该字符的字符串中得到了追溯错误:UnicodeEncodeError: 'ascii' codec can't encode character u'\u2606' in position 5: ordinal not in range(128)

我使用语言环境模块找出我的操作系统支持的设置,虽然我不确定我应该使用语言环境解决我的问题,并注意到(en_US', 'cp1252')的默认设置。我试图将其更改为('en_US', 'utf-8'),但遗憾的是无济于事。

#code for default settings
print locale.getdefaultlocale()

这是我用来缩小区域设置选项范围的代码。 (这里没有问题,代码只是任何想要的人,可以跟随)

import locale
all = locale.locale_alias().items()
utfs = [(k,v) for k,v in all if 'utf' in k.lower() or 'utf' in v.lower()]

# utf settings starting with en
en_utfs = [(k,v) for k,v in utfs if k.lower()[:2].lower() == 'en' or 
            v.lower()[:2] == 'en'

print en_utfs

这给出了输出:

[('en_ie.utf8@euro', 'en_IE.UTF-8'), ('universal.utf8@ucs4', 'en_US.UTF-8')]

这是我的问题所在;尝试将设置更改为en_US.UTF-8

[IN]: locale.setlocale( locale.LC_ALL, 'en_US.UTF-8' )
[OUT]: Traceback code ...
[OUT]: locale.Error: unsupported locale setting

对于所有代码感到抱歉,出于某种原因,我觉得有必要这样做。

3 个答案:

答案 0 :(得分:4)

选中此https://docs.moodle.org/dev/Table_of_locales

我认为在Windows中你需要设置'localewin'值而不是语言环境名称。设置locale.setlocale( locale.LC_ALL, 'English_United States.1252' )在Windows中为我工作。我也试过设置不同的语言环境Dutch_Netherlands.1252并且它们有效。虽然这可能无法解决您的UnicodeEncodeError问题,但我认为这至少解释了为什么您无法设置语言环境。

答案 1 :(得分:0)

我无法解决我的问题,但我通过删除所有非ASCII字符找到了解决方法。请参阅堆栈答案replace non ascii-characters with a single space

答案 2 :(得分:0)

您需要使用全名。例如,使用:

locale.setlocale( locale.LC_CTYPE, 'Chinese (Simplified)_People\'s Republic of China' )  

而不是

locale.setlocale(locale.LC_ALL,'zh_CN.cpk936')      

如果成功,你应该期待这个结果:

print(locale.getlocale(locale.LC_CTYPE))    
("Chinese (Simplified)_People's Republic of China", '936')