Найти - Пользователи
Полная версия: Работа со строками
Начало » Python для экспертов » Работа со строками
1 2 3
py.user.next
Budulianin
Теже самые символы в той же самой последовательности?
Тебе нужно понять, что такое юникод.

Budulianin
Unicode это стандарт, в соответствии с которым, каждому символу определён код типа \u0444.
Не, юникод - это набор чисел, часть из которых отображается на символы, часть отображается на кусочки символов, а часть вообще отображается на пустоту.
Ты не можешь считать это набором символов, потому что очень многие числа не соотвествуют ничему. Числа называются “кодовые точки”. Этих чисел около одного миллиона.

>>> 65536 * 17
1114112
>>>

Они разделены на блоки по 65536 чисел. Первый блок называется BMP (Basic Multilingual Plane). В этом блоке помещается практически всё европейское. Также в этом блоке есть и служебные кодовые точки, которые называются суррогатами. Из пар этих точек можно составлять точки в оставшейся части юникода.

Вот utf-16 - двубайтовая кодировка, её хватает на кодирование только этой BMP. Но, так как в BMP есть суррогаты, то в этой кодировке можно представить и любую кодовую точку из оставшихся 16 плоскостей.

Что такое кодировки utf-8, utf-16 и utf-32? Это кодировки для всего юникода. То есть каждая из этих кодировок может представить любую кодовую точку юникода. Каждая из этих кодировок делает это по-своему: utf-32 является прямой кодировкой, utf-16 - экономной кодировкой, utf-8 - оптимальной кодировкой.

Budulianin
Теже самые символы в той же самой последовательности?
latin1 была до юникода, ascii была до latin1. Поэтому ascii входит в latin1, а latin1 входит в юникод.

Budulianin
Дак если latin1 перевели в Unicode, он должен быть записан символами Unicode

>>> u'\xd1' is u'\u00d1'
True
>>>
Budulianin
py.user.next

В чём прикол?

>>> 'ф'.decode('latin1') is 'ф'.decode('latin1')
False

>>> id('ф'.decode('latin1')) == id('ф'.decode('latin1'))
True
py.user.next
Это глюки питона.
>>> a = 'ф'.decode('latin1')
>>> b = 'ф'.decode('latin1')
>>> a is b
False
>>> a, b
(u'\xd1\x84', u'\xd1\x84')
>>> u'\xd1\x84' is u'\xd1\x84'
True
>>> 

В третьем то же самое.
>>> a = b'\xd1\x84'.decode('latin1')
>>> b = b'\xd1\x84'.decode('latin1')
>>> a is b
False
>>> a, b
(\x84', \x84')
>>> 
>>> b'\xd1\x84' is b'\xd1\x84'
True
>>>

Глюки не запрещённые.
Budulianin
py.user.next
Это глюки питона.
Хе-хе, баг наковырял.

py.user.next
Глюки не запрещённые.
Что значит не запрещённые? Это баг, надо править.
py.user.next
Budulianin
Что значит не запрещённые?
Нигде не сказано, что одинаковые константы должны указывать на один объект. Если C рассматривать, там то же самое по поводу строковых литералов.

Budulianin
Это баг, надо править.
В питоне подобных несостыковок - вагон и маленькая тележка.

>>> 'abc'.endswith(('a', 'b', 'c'))
True
>>> 'abc'.endswith(['a', 'b', 'c'])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: endswith first arg must be str or a tuple of str, not list
>>>

Казалось бы, тут должен быть любой итерэбл, а не только кортеж. Но они говорят, что там вообще должно быть только множество. То есть, если у тебя откуда-то список окончаний, ты должен его приводить ко множеству. Вопрос: почему я не могу сам решить?
Budulianin
py.user.next
Нигде не сказано, что одинаковые константы должны указывать на один объект.
Вообще-то сказано. Про числа например от -4 до 255, хе хе. И про короткие строки.

Но тут всё честно.

>>> a = 'ф'.decode('latin1')
>>> b = 'ф'.decode('latin1')
>>> id(a)
3065670568L
>>> id(b)
3065669464L

Конкретно в таком случае нечестно.
>>> 'ф'.decode('latin1') is 'ф'.decode('latin1')
False

Потому что id один
>>> id('ф'.decode('latin1')) == id('ф'.decode('latin1'))
True
Budulianin
py.user.next
Но они говорят, что там вообще должно быть только множество.
py.user.next
must be str or a tuple of str
py.user.next
Не, в смысле я у них спрашивал, почему такая несостыковка.

Budulianin
Конкретно в таком случае нечестно.
Budulianin
Потому что id один
Так это разные случаи просто. Там, где id один, они и по is совпадают. А там, где по is не совпадают, там и id разные.

Budulianin
Вообще-то сказано. Про числа например от -4 до 255, хе хе. И про короткие строки.
Да, типа может быть, а может не быть. Где-то что-то.
Budulianin
py.user.next
Там, где id один, они и по is совпадают.
Почему разные-то ?
>>> id('ф'.decode('latin1')) == id('ф'.decode('latin1'))
True
>>> 'ф'.decode('latin1') is 'ф'.decode('latin1')
False
py.user.next
Ну, очевидно же, что питон по-разному обрабатывает эти строки. В первом случае он создаёт один объект, а во втором - два.
То, что они одинаково обрабатываются, - это твоё предположение.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB