Какой у вас префикс в строке Python?

232

Как в:

u'Hello'

Я думаю, что это означает «Юникод», это правильно?

Если да, то с каких пор это доступно?

OscarRyz
источник

Ответы:

147

Вы правы, см. 3.1.3. Юникод Строки .

Это был синтаксис начиная с Python 2.0.

Python 3 сделал их избыточными, так как тип строки по умолчанию - Unicode. Версии 3.0–3.2 удалили их, но они были повторно добавлены в 3.3+ для совместимости с Python 2 для облегчения перехода с 2 на 3.

Стефан Кендалл
источник
6
Следует добавить, что в Python 3 это больше не нужно, но все еще действует синтаксис.
Мартин Тома
Объединение строк Unicode + raw (regex) (например ur"string") допустимо в Python 2, но, к сожалению, это неверный синтаксис в Python 3.
cowlinator
123

Значение u in u'Some String'означает, что ваша строка является строкой Unicode .

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

A: Вам действительно следует прочитать статью Абсолютного минимума, которую каждый Джоэл разрабатывает абсолютно, положительно должен знать о Юникоде и наборах символов (без извинений!) О наборах символов.

Q: сри без кода времени, пожалуйста

Штраф. попробуйте str('Some String')или 'Some String'.encode('ascii', 'ignore'). Но вы действительно должны прочитать некоторые ответы и обсуждение Преобразования строки Unicode и этого превосходного, отличного учебника по кодированию символов.

Андрей
источник
6
Это работает, если строка содержит только текст ASCII . Во всех остальных случаях вам придется явно кодировать.
Мартин Питерс
2
Это рассматривает вас как нечто, «чтобы избавиться». Это говорит мне, что вы на самом деле не понимаете, что это такое. Как правило, вы не просто хотите «избавиться» от него, и правильный способ создания байтовой строки из строки Unicode зависит от того, что эта строка содержит и в каком контексте.
Леннарт Регебро
2
@LennartRegebro полностью согласился - это был однозначный ответ, который должен был быть языком в щеке, но он набрал своего рода ужасающее количество голосов. отредактированный, чтобы попытаться направить людей в правильном направлении.
Андрей
1
Это было весело читать! Спасибо! Статье 17 лет и до сих пор она точная. Вот это да.
Кервин Снейдерс
52

Я думаю, что это означает «Юникод», это правильно?

Да.

Если да, то с каких пор это доступно?

Python 2.x.

В Python 3.x строки по умолчанию используют Unicode, и uпрефикс не нужен . Примечание: в Python 3.0-3.2, u является синтаксической ошибкой. В Python 3.3+ снова разрешено писать 2/3 совместимых приложений.

kennytm
источник
4
Это даже синтаксическая ошибка в Python 3, чтобы использовать uпрефикс.
Тим Пицкер
14
@TimPietzcker: только в 3.0-3.2; в 3.3+ это законно (и бессмысленно), чтобы упростить написание 2.6 + / 3.3 + библиотек и приложений с одной кодовой базой.
abarnert
@abarnert: Ну, этому комментарию уже четыре с половиной года :)
Тим Пицкер,
3
@TimPietzcker: Конечно, но так как ваш комментарий был полезным дополнением для любого, кто нашел этот полезный ответ при поиске в 2010 году, я думаю, что было бы полезно упомянуть изменение в 3.3 для любого, кто найдет его в 2014 году. Возможно, было бы лучше отредактировать ответ, но я думаю, что это незначительный момент, с которым большинство людей не столкнется (потому что, если вы не используете 3.0-3.2 в 2014 году, «нет необходимости в префиксе» - это все, что вам нужно знать).
abarnert
Если вы пишете код для произвольных пользователей для загрузки и запуска и хотите охватить большинство возможных случаев, не делая предположений, полезно знать, что 3.0-3.2 сломается. Потому что вам нужно решить, хотите ли вы использовать six.text_type()повсеместно для (надеюсь, крошечного) числа людей, все еще использующих 3. [012] - по крайней мере, информация там, чтобы вы могли выбрать.
Двандерсон
3

Я пришел сюда, потому что у меня был синдром смешного чарса на моем requestsвыходе. Я думал, response.textчто даст мне правильно декодированную строку, но в выводе я нашел смешные двойные символы, где должны были быть немецкие умлауты.

Оказывается, response.encodingбыло как-то пусто, и поэтому responseне знал, как правильно декодировать контент, и просто рассматривал его как ASCII (я думаю).

Мое решение состояло в том, чтобы получить необработанные байты с помощью «response.content» и применить вручную decode('utf_8') их. Результатом было schöne Umlaute.

Правильно декодированный

мех

против неправильно декодированных

fĂźr

Крис
источник
2

Все строки, предназначенные для людей, должны использовать "".

Я обнаружил, что следующий подход очень помогает при работе со строками Python: Все строки манифеста Python должны использовать u""синтаксис. ""Синтаксис для байтовых массивов, только.

Прежде чем начать избиение, позвольте мне объяснить. Большинство программ Python начинаются с использования ""для строк. Но тогда им нужно поддерживать документацию из Интернета, чтобы они начали использовать"".decode и внезапно они получают исключения везде о декодировании того или иного - все из-за использования ""для строк. В этом случае Unicode действует как вирус и может нанести ущерб.

Но если вы будете следовать моему правилу, у вас не будет этой инфекции (потому что вы уже будете заражены).

Фрэнк Крюгер
источник
bash -c "echo Shouldn\\'t you use b\\\"...\\\" for byte arrays?"
Kennytm
@KennyTM Звучит хорошо! Проще говоря, все строки, предназначенные для людей, должны использоваться u"".
Фрэнк Крюгер
1
Если вы хотите неукоснительно использовать Unicode везде - что хорошо для многих приложений (но не для всех) - вам почти наверняка нужен Python 3.x, а не 2.x. Возможно, это не было правдой в 2010 году, когда это было написано, но в 2014 году большинство библиотек или платформ, которые не позволяют выполнить обновление до 3.x, также будут препятствовать правильному использованию Unicode…
abarnert
1

Это Юникод.

Просто поместите переменную между ними str(), и она будет работать нормально.

Но если у вас есть два списка, как показано ниже:

a = ['co32','co36']
b = [u'co32',u'co36']

Если вы проверите set(a)==set(b), это будет ложным, но если вы сделаете следующее:

b = str(b)
set(a)==set(b)

Теперь результат будет True.

user3251882
источник
Опасность, опасность. Вы никогда не должны кодировать Unicode ( str()или u'€'.encode()) без передачи кодировки. Если строка содержит не ASCII, пользователь получит исключение UnicodeEncodeException.
Аластер МакКормак
3
Кроме того, ваш код не работает. b = str(b)просто дает строку repr()списка, то есть b = "[u'co32', u'co36']". Тогдаset(a)==set(b) = False
Аластер МакКормак