2017-03-07 66 views
1

所以我在Python中使用'æ','ø'和'å'時會出現這個奇怪的問題。Python中的斯堪的納維亞字母2.7

我已經包括:# - - 編碼: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 

我能找到解決islower判斷()和isupper(的問題),不工作的「æ」,「O」和「a」通過只是在做c.islower() or c in "æøå"來檢查c是否是小寫字母,但如上所示,'æ'的兩部分都將被視爲小寫字母並被計爲雙精度。

有沒有辦法讓這些字母像其他字母一樣行事?

我在windows 10上運行python 2.7,使用canopy作爲獲取我需要的sklearn和numpy的簡單方法。

回答

0

你已經偶然發現python 2默認的字符串是字節的問題。用你的頭文件# - coding:utf-8 - 你只告訴解釋器你的源代碼是utf-8,但是這樣做有對處理字符串沒有影響。

的解決問題的方法是將所有的字符串轉換爲Unicode對象轉換與解碼方法,e.g應固定

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 
+0

謝謝,完美的作品。雖然令人討厭,但如果所有東西都可以成爲英文,那將會非常簡單:) – Gnurgen

相關問題