Python-3 и \x Vs \u Vs \U в строковой кодировке и почему

Почему в Python 3 используются разные представления строк, ориентированные на байты? Не будет ли достаточно иметь одно представление вместо нескольких?

Для печати номера диапазона ASCII строка показывает последовательность, начинающуюся с \x:

 In [56]: chr(128)
 Out[56]: '\x80'

В другом диапазоне чисел Python использует последовательность, начинающуюся с \u.

In [57]: chr(57344)
Out[57]: '\ue000'

Но числа в самом высоком диапазоне, то есть максимальное число Unicode на данный момент, используют начальный \U:

In [58]: chr(1114111)
Out[58]: '\U0010ffff'

person MaNKuR    schedule 09.09.2017    source источник


Ответы (1)


Python дает вам представление строки, а для непечатаемых символов будет использоваться самая короткая доступная управляющая последовательность.

\x80 — это тот же символ, что и \u0080 или \U00000080, но \x80 просто короче. Для chr(57344) самым коротким обозначением является \ue000, вы не можете выразить тот же символ с помощью \xhh, это обозначение можно использовать только для символов до \0xFF.

Для некоторых символов есть даже однобуквенные escape-последовательности, например \n для новой строки или \t для табуляции.

Python имеет несколько вариантов записи по историческим и практическим причинам. В строке байтов вы можете создавать байты только в диапазоне от 0 до 255, поэтому \xhh полезен и более лаконичен, чем необходимость использовать \U000hhhhh везде, когда вы даже не можете использовать весь доступный для этого диапазон. обозначения, а \xhh и \n и связанные с ними коды знакомы программистам по другим языкам.

person Martijn Pieters    schedule 09.09.2017
comment
Разве здесь не применяется та же логика \U0010ffff', и вместо этого должно быть \U10ffff' or ჿff' - person MaNKuR; 09.09.2017
comment
@MaNKuR: нет, потому что синтаксис \U имеет фиксированную ширину. Требуется 8 шестнадцатеричных символов; а синтаксис \u занимает 4. Если бы они принимали переменное количество шестнадцатеричных символов, вы не могли бы следовать за ними с другими буквами ascii или цифрами, которые просто имеют шестнадцатеричное значение, но не являются частью управляющей последовательности. - person Martijn Pieters; 09.09.2017
comment
@MaNKuR: \U - это 8 шестнадцатеричных символов, потому что стандарт Unicode мог бы расшириться, чтобы потребовать все эти цифры. Тот факт, что максимальная кодовая точка сегодня равна \U0010FFFF, не означает, что будущее обновление стандарта Unicode никогда не достигнет \UFFFFFFFF. - person Martijn Pieters; 09.09.2017
comment
Я все еще путаюсь, \u00a3 и \xa3 одинаковы для символа £. А \ua3 не сработает? - person mingchau; 22.08.2019
comment
@mingchau: \ua3 не может работать, потому что это недопустимая escape-последовательность \uhhhh, Python просто не принимает более короткие формы. Это потому, что принимать более короткие escape-последовательности было бы очень запутанно. Содержит ли текст 'Hello \ua3darling' escape-последовательность \ua, \ua3, \ua3d или \ua3da? - person Martijn Pieters; 22.08.2019
comment
@MartijnPieters, эта информация о различиях задокументирована где-нибудь в официальных документах Python? Если да - поделитесь ссылкой для ознакомления. - person Rocckk; 13.01.2021
comment
Управляющие последовательности @Rock являются частью ссылки на строковые литералы< /а>. - person Martijn Pieters; 14.01.2021
comment
Что, если в строке все это смешано? - person Vishal Kumar Sahu; 17.01.2021
comment
@VishalKumarSahu: строковое представление является согласованным и выбирает лучший вариант для каждой кодовой точки в строке. Вы могли бы попробовать это, конечно. :-) - person Martijn Pieters; 17.01.2021