所以当我在python中使用'æ','ø'和'å'时,我遇到了这个奇怪的问题。
我已经包括:# - - 编码:utf-8 - -
在每个文件的顶部,æøå打印好,所以不用担心。但是,如果我len('æ')
我得到2.我正在制作一个程序,我循环并分析丹麦文本,所以这是一个大问题。
下面是python终端的一些例子来说明问题:
In [1]: 'a'.islower()
Out[1]: True
In [2]: 'æ'.islower()
Out[2]: False
In [3]: len('a')
Out[3]: 1
In [4]: len('æ')
Out[4]: 2
In [5]: for c in 'æ': print c in "æøå"
True
True
In [6]: print "æøå are troublesome characters"
æøå are troublesome characters
我可以通过简单地执行c.islower() or c in "æøå"
检查c是小写字母来解决islower()和isupper()不能用于'æ','ø'和'å'的问题,但是如上所示,'æ'的两个部分将计为小写并计算为双倍。
有没有办法可以让这些字母像任何其他字母一样?
我使用canopy在Windows 10上运行python 2.7,这是获取我需要的sklearn和numpy的简单方法。
答案 0 :(得分:2)
你偶然发现了python 2中默认字符串是字节的问题。使用你的标题# - coding:utf-8 - 你只告诉解释器你的源代码是utf-8但是没有对字符串处理的影响。
您的问题的解决方案是使用解码方法将所有字符串转换为unicode对象,例如
danish_text_raw = 'æ' # here you would load your text
print(type(danish_text_raw)) # returns string
danish_text = danish_text_raw.decode('utf-8')
print(type(danish_text)) # returns <type 'unicode'>
islower和len的问题应该修复。确保您在程序中使用的所有字符串都是unicode而不是字节对象。否则比较会导致奇怪的结果。例如
danish_text_raw == danish_text # this yields false
要确保使用unicode字符串,您可以使用此函数来确保它
def to_unicode(in_string):
if isinstance(in_string,str):
out_string = in_string.decode('utf-8')
elif isinstance(in_string,unicode):
out_string = in_string
else:
raise TypeError('not stringy')
return out_string