蟒蛇2.7

时间:2017-03-07 13:14:03

标签: python-2.7 character-encoding special-characters

所以当我在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的简单方法。

1 个答案:

答案 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