3

使用 Python 2.7

我正在编写一个抽象的网络抓取工具,并且在显示(打印)某些字符时遇到问题。

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

我使用 locale 模块来查找我的操作系统支持的设置,虽然我不确定我是否应该使用 locale 来解决我的问题,并注意到默认设置 where (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

对不起所有的代码,出于某种原因,我觉得有必要这样做。

4

3 回答 3

6

检查这个https://docs.moodle.org/dev/Table_of_locales

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

于 2014-12-12T06:55:20.483 回答
0

我无法解决我的问题,但我通过删除所有非 ASCII 字符找到了解决方法。请参阅堆栈答案用单个空格替换非 ascii 字符

于 2014-12-12T07:33:44.587 回答
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')       
于 2017-01-22T18:07:36.807 回答