2013-06-01 56 views
0

我在mac os上運行python 2.7 x 10.6,utf8中的文件和utf8中的終端。使用unicode字符在字符串上迭代時字符串字符被錯誤解釋

我想在給定字符串中存在的元音å,ä或ö的每次出現之後添加句點。

這裏是什麼,我試圖做的簡單化版本:

# coding: utf8 

a = 'change these letters äöå' 

b = map((lambda x: a.replace(x, "{0}.".format(x))), 'åäö') 

for c in b: 
    print c 

這procudes以下的輸出:

change these letters ?.??.??.? 
change these letters äöå. 
change these letters ?.??.??.? 
change these letters ä.öå 
change these letters ?.??.??.? 
change these letters äö.å 

爲什麼我得到問號行?經過進一步的研究,只是這樣做會產生相同的問號。

# coding: utf8 

for letter in 'åäö': 
    print letter 

輸出:

? 
? 
? 
? 
? 
? 

但在此之前明確地添加的U給

# coding: utf8 
for letter in u'åäö': 
    print letter 

輸出:

å 
ä 
ö 

解碼和編碼明確回字符串utf8仍然產生問號。這裏有什麼問題?什麼是這個循環?

附註:在愚蠢的例子中,你看到了我想要做的。實際上,我正在使用保存字符串的對象,以便映射的操作發生在同一個字符串上。因此,map()調用實際上每次調用一個新元音的對象方法,從而更新保存在對象中的字符串。該對象的方法使用第二個參數map中的元音執行替換,並更新存儲的字符串。

回答

2

您正在將匿名函數映射到字符串上;你應該把它映射到一個字符串列表上。 Python解釋器仍然會接受你給出的指令,將字符串視爲一個序列,並將lambda應用於該序列的每個組件。但是在這種情況下,組件是字符串的個別字節,並且每個unicode字符都是兩個字節。所以更換是執行六次。

此外,在其中三個迭代的更換更換的unicode前綴字節0xc3(其中發生三次äöå)的相同操作,具有0xc3.,打破了串a中的字符編碼,併產生原始字節亂碼。在其他三次迭代中,用一個字節後跟一個句點替換unicode char的第二個字節,所以結果字符串仍然包含所討論字符的字節序列,並得到所需的結果。但是,這是而不是,因爲您要用該字符替換整個字符,然後是一個句點。

比較:

>>> a = 'change these letters äöå' 
>>> b = map((lambda x: a.replace(x, "{0}.".format(x))), 'å ä ö'.split()) 
>>> for c in b: 
... print c 
... 
change these letters äöå. 
change these letters ä.öå 
change these letters äö.å 
+0

我唯一沒有嘗試過的,包含每個元音分開的列表。非常感謝你! – Parham

1

你遍歷一個字節串的字節數。由於編碼爲UTF-8的非ASCII字符使用多個字節,因此您會破壞字符。如果你必須迭代字符,然後迭代unicode的字符。

+0

這是我轉向最終看到的選項,因爲lower()函數在某些unicode字符上不起作用... – Parham