2015-02-10 2 views
1

Я пишу некоторые модульные тесты в Python, и теперь у меня довольно странная ошибка. Я сравниваю две строки, которые кажутся совершенно одинаковыми, но я получаю ошибку утверждения. Приведенный ниже код выводит то, что я заметил позади:Почему эти две строки юникода Python отличаются?

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'). –

+0

Проверьте текущий код для разного характера. Существует много символов, которые выглядят одинаково (как пробелы) – Slam

+1

для перечисления, i в перечислении (a): print ord (a [enum]), ord (b [enum]), [enum] == b [enum] # см., что кодирует – LexyStardust

ответ

6

Юникода определяет кучу различных космических символов:

table of Unicode space characters

(таблицы с помощью https://www.cs.tut.fi/~jkorpela/chars/spaces.html).

Чтобы точно узнать, что происходит, мода ваш код, как:

from unicodedata import name 

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

... и точные символы в использовании будут сделаны явными.

+0

Это отстой. Знаете ли вы, как я мог преобразовать все пробелы в строку юникода в один конкретный (наиболее распространенный) тип пространства? – kramer65

+3

Это совсем не сосать. – Christian

+0

Хорошо, я просто читал о свободных местах и ​​почему они полезны. Христианин был прав; это совсем не сосать :). Поэтому я исправил это, заменив пробелы без пробелов для нормальных пространств, выполнив следующее: 'b.replace (u" \ u00A0 "," ")'. Спасибо, что просветил меня! – kramer65

Смежные вопросы