Что именно делают строковые префиксы "u" и "r" и что такое необработанные строковые литералы?
Задавая этот вопрос, я понял, что мало что знаю о необработанных строках. Для человека, называющего себя тренером Django, это отстой.
Я знаю, что такое кодировка, и я знаю, что делает u''
alone, поскольку я получаю то, что называется Unicode.
Но что именно
r''
делает? Какую строку это приводит?И, прежде всего, что, черт возьми, делает
ur''
?Наконец, есть ли какой-либо надежный способ вернуться от строки Unicode к простой необработанной строке?
Ах, и, кстати, если ваша система и кодировка вашего текстового редактора установлены в UTF-8,
u''
на самом деле что-нибудь делает?
Переведено автоматически
Ответ 1
На самом деле никакой "необработанной строки" не существует; есть необработанные строковые литералы, которые в точности являются строковыми литералами, отмеченными 'r'
перед открывающей кавычкой.
"Необработанный строковый литерал" - это немного другой синтаксис строкового литерала, в котором обратная косая черта, \
, принимается как означающая "просто обратную косую черту" (за исключением случаев, когда она стоит прямо перед кавычкой, которая в противном случае завершала бы литерал) - никаких "escape-последовательностей" для представления новых строк, табуляций, обратных пробелов, каналов формы и так далее. В обычных строковых литералах каждая обратная косая черта должна быть удвоена, чтобы ее не принимали за начало escape-последовательности.
Этот вариант синтаксиса существует в основном потому, что синтаксис шаблонов регулярных выражений изобилует обратными косыми чертами (но никогда в конце, поэтому предложение "except" выше не имеет значения), и он выглядит немного лучше, когда вы избегаете удвоения каждой из них - вот и все. Также приобрело некоторую популярность выражение собственных путей к файлам Windows (с обратной косой чертой вместо обычной, как на других платформах), но это требуется очень редко (поскольку обычные косые черты в основном отлично работают и в Windows) и несовершенно (из-за предложения "except" выше).
r'...'
это байтовая строка (в Python 2. *), ur'...'
это строка в Юникоде (опять же, в Python 2. *), и любой из трех других видов кавычек также создает точно такие же типы строк (так, например, r'...'
, r'''...'''
, r"..."
, r"""..."""
все это байтовые строки и так далее).
Не уверен, что вы подразумеваете под "возвращением назад" - по сути, нет указаний назад и вперед, потому что нет необработанного строкового типа, это просто альтернативный синтаксис для выражения совершенно обычных строковых объектов, какими бы они ни были, в байтах или юникоде.
И да, в Python 2. *, u'...'
это, конечно, всегда отличается от just '...'
- первое представляет собой строку в юникоде, второе - строку в байтах. В какой кодировке может быть выражен литерал, является полностью ортогональной проблемой.
Например, рассмотрим (Python 2.6):
>>> sys.getsizeof('ciao')
28
>>> sys.getsizeof(u'ciao')
34
Объект Unicode, конечно, занимает больше места в памяти (очевидно, очень небольшая разница для очень короткой строки ;-).
Ответ 2
В Python 2 существует два типа строк: традиционный str
тип и более новый unicode
тип. Если вы вводите строковый литерал без u
впереди, вы получаете старый str
тип, который хранит 8-битные символы, а с u
впереди вы получаете более новый unicode
тип, который может хранить любой символ Юникода.
r
Вообще не меняет тип, он просто меняет способ интерпретации строкового литерала. Без r
обратная косая черта обрабатывается как escape-символы. С помощью r
обратная косая черта обрабатывается как литерал. В любом случае, тип один и тот же.
ur
это, конечно, строка в Юникоде, где обратные косые черты являются буквальными обратными косыми чертами, а не частью escape-кодов.
Вы можете попытаться преобразовать строку Unicode в старую строку с помощью str()
функции, но если есть какие-либо символы unicode, которые не могут быть представлены в старой строке, вы получите исключение. При желании вы могли бы сначала заменить их вопросительными знаками, но, конечно, это сделало бы эти символы нечитаемыми. Не рекомендуется использовать тип str
, если вы хотите правильно обрабатывать символы юникода.
Ответ 3
"необработанная строка" означает, что она хранится в том виде, в каком она появляется. Например, '\'
это просто обратная косая черта вместо экранирующего.
Ответ 4
Позвольте мне объяснить это просто: в python 2 вы можете хранить string в двух разных типах.
Первый - это ASCII, который является типом str в python, он использует 1 байт памяти. (256 символов, будут храниться в основном английские алфавиты и простые символы)
Второй тип - это UNICODE, который является типом unicode в python. Unicode хранит все типы языков.
По умолчанию python предпочитает тип str, но если вы хотите сохранить строку в типе unicode, вы можете поместить u перед текстом, например, u'text' или вы можете сделать это, вызвав unicode ('text')
Итак, u - это просто короткий способ вызвать функцию для преобразования str в unicode. Вот и все!
Теперь часть r, вы помещаете ее перед текстом, чтобы сообщить компьютеру, что текст является необработанным текстом, обратная косая черта не должна быть экранирующим символом. r '\n' не создаст новый символ строки. Это просто обычный текст, содержащий 2 символа.
Если вы хотите преобразовать str в юникод, а также поместить туда необработанный текст, используйте ur, потому что ru выдаст сообщение об ошибке.
ТЕПЕРЬ важная часть:
Вы не можете сохранить одну обратную косую черту с помощью r, это единственное исключение. Таким образом, этот код выдаст ошибку: r'\'
Для хранения обратной косой черты (только одной) вам нужно использовать '\\'
Если вы хотите сохранить более 1 символа, вы все равно можете использовать r, например, r '\\' создаст 2 обратные косые черты, как вы и ожидали.
Я не знаю причину, по которой r не работает с одним хранилищем обратной косой черты, но причина пока никем не описана. Я надеюсь, что это ошибка.