2015-02-10 99 views
1

我正在用Python編寫一些單元測試,現在我有一個相當奇怪的錯誤。我比較兩個字符串,看起來完全相同,但我得到一個斷言錯誤。下面的代碼打印出什麼我評論的背後:這兩個Python unicode字符串爲什麼不同?

print type(a), len(a), a # <type 'unicode'> 12 € 290.000,00 
print type(b), len(b), b # <type 'unicode'> 12 € 290.000,00 
print a == b # False 

因此,要找出其中的人物是不同的,我打印出來,並通過文字比較字符串的字符:

for enum, i in enumerate(a): 
    print a[enum], b[enum], a[enum] == b[enum] 

這種打印出:

€ € True 
     False # <== THE SPACE IS NOT EQUAL?!!? 
2 2 True 
9 9 True 
0 0 True 
. . True 
0 0 True 
0 0 True 
0 0 True 
, , True 
0 0 True 
0 0 True 

所以,令我驚訝的是,空間是使這兩個字符串不相等的字符。我真的不明白這一點。爲什麼兩個unicode字符串中的空格不同?

有人知道這裏有什麼錯嗎?歡迎所有提示!

+3

我的精神力量告訴我其中一個空間是一個不間斷的空間('U + 00A0'),而不是一個「正常」空間('U + 0020')。 – 2015-02-10 14:29:00

+0

查看不同字符的實際代碼。 (a):print ord(a [enum]),ord(b [enum]),a [enum] == b [enum]#枚舉中有很多字符看起來相同(如空格) – Slam 2015-02-10 14:30:21

+1

看看代碼點是什麼 – LexyStardust 2015-02-10 14:37:09

回答

6

Unicode定義一串不同空格字符:

table of Unicode space characters

(表經由https://www.cs.tut.fi/~jkorpela/chars/spaces.html)。

要看看到底發生了什麼事情,MOD你的代碼,如:

from unicodedata import name 

for enum, i in enumerate(a): 
    print name(a[enum]), name(b[enum]), a[enum] == b[enum] 

...和所使用的確切字符將被作出了明確。

+0

這很糟糕。那麼你會知道我怎樣才能將unicode字符串中的所有空格轉換爲一個特定的(最常見的)類型的空間? – kramer65 2015-02-10 14:30:38

+3

它根本不吸。 – Christian 2015-02-10 14:31:22

+0

好的,我剛剛閱讀了關於不間斷空間以及它們爲什麼有用的原因。基督徒是對的;它根本不吸收:)。所以我通過這樣做來替換普通空格的不間斷空格來修復它:'b.replace(u「\ u00A0」,「」)''。感謝您的啓發! – kramer65 2015-02-10 14:43:27

相關問題