17

я заметил следующие трюмы:Будет ли строка UNICODE, содержащая только символы ASCII, всегда равна строке ASCII?

>>> u'abc' == 'abc' 
True 
>>> 'abc' == u'abc' 
True 

Будет ли это всегда быть правдой или это могло возможно зависеть от языка системы? (кажется строки Юникода в Python 3: например this question, но байты в 2.x)

+0

Символы в наборе ASCII являются агностиками кодировки. Это только расширенные символы (от 0x80 до 0xff), которые могут различаться между локалями. – Phylogenesis

+5

@Phylogenesis: существует множество кодировок, которые * не * используют ASCII в качестве базы. –

ответ

13

Python 2 принуждают между unicode и str с помощью ASCII кодека при сравнении двух типов. Так что да, это всегда true.

То есть, если вы не испортили установку Python и не использовали sys.setdefaultencoding(), чтобы изменить это значение по умолчанию. Вы не можете сделать это нормально, потому что функция sys.setdefaultencoding()удалила из модуля во время запуска, но есть Cargo Cult, где люди используют reload(sys), чтобы восстановить эту функцию и изменить кодировку по умолчанию на что-то еще, чтобы попробовать и исправить проблемы неявного кодирования и декодирования. По этой причине это глупо.

+1

Что именно не так с 'sys.setdefaultencoding()'? –

+1

@techtonik: изменение системного значения по умолчанию может привести к поломке пакетов, которые полагаются на значение по умолчанию ASCII, и изменение его только * маскирует * проблемы, с которыми имеет код, полагаясь на неявное кодирование и декодирование. Если бы вы установили его на латинский-1, все байтово-юникодные декодирования волшебным образом работали, но на самом деле не имеют смысла, если вы установите его в UTF-8, все кодировки в кодировке unicode-байта будут работать, но могут не иметь смысла и т. Д. Вы эффективно пре-откладывать ногу на случай, если она сломается, вместо того, чтобы не ломать ногу в первую очередь. –

+0

Похож на проблему [workflow] (https://xkcd.com/1172/). Есть ли более реальный/явный пример? –

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