Який префікс u в рядку Python?


232

Як у:

u'Hello'

Я здогадуюсь, що він позначає "Unicode", чи правильно?

Якщо так, то коли він доступний?

Відповіді:


147

Ви маєте рацію, див. 3.1.3. Unicode рядки .

Це був синтаксис з 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 u'Some String'означає, що ваша рядок є рядком Unicode .

З: Я дуже страшно поспішаю, і я приземлився тут із Пошуку Google. Я намагаюся записати ці дані у файл, я отримую помилку, і мені потрібні мертві найпростіші, напевно, помилкові рішення цієї секунди.

Відповідь: Ви дійсно повинні читати абсолютний мінімум Джоеля, кожен розробник програмного забезпечення абсолютно, позитивно повинен знати про Unicode та набори символів (без виправдань!) Есе про набори символів.

Питання: sry no time code pls

Добре. спробуйте str('Some String')або 'Some String'.encode('ascii', 'ignore'). Але ви дійсно повинні прочитати деякі відповіді та обговорення щодо перетворення рядка Unicode і цей відмінний, відмінний буквар на кодування символів.


6
Це працює, якщо рядок містить лише текст ASCII . У всіх інших випадках вам доведеться явно кодувати.
Martijn Pieters

2
Це трактує u '' як щось "позбутися". Це говорить мені, що ти насправді не розумієш, що це таке. Ви, як правило, не просто бажаєте "позбутися", а правильний спосіб створення байтового рядка з рядка Unicode залежить від того, що ця рядок містить і в якому контексті.
Леннарт Регебро

2
@LennartRegebro цілком погодився - це була відповідь на викид, яка мала бути виразною щокою, але вона накопичила якусь жахливу кількість відгуків. редагували, щоб спробувати направляти людей у ​​правильному напрямку.
Андрій

1
Це було веселе прочитання! Дякую! Статті 17 років, і вона досі точна. Ого.
Кервін Снайдердерс

52

Я здогадуюсь, що він позначає "Unicode", чи правильно?

Так.

Якщо так, то коли він доступний?

Python 2.x.

У Python 3.x рядки використовують Unicode за замовчуванням і немає необхідності в uпрефіксі. Примітка: у Python 3.0-3.2 u - помилка синтаксису. У Python 3.3+ знову законно, щоб було простіше писати 2/3 сумісні програми.


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] - принаймні інформація є, щоб ви могли вибрати.
dwanderson

3

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

Виявляється, response.encodingбуло якось порожньо, і тому я responseне знав, як правильно розшифрувати вміст, і просто трактував його як ASCII (я думаю).

Моє рішення полягало в тому, щоб отримати необроблені байти з 'response.content' і застосувати decode('utf_8')до нього вручну . Результатом став Schöne Umlaute.

Правильно розшифрована

für

порівняно з неправильно розшифрованими

fĂźr


2

Усі рядки, призначені для людей, повинні використовувати u "".

Я виявив, що такий спосіб мислення дуже допомагає при роботі з рядками 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

Це Unicode.

Просто поставте змінну між str(), і вона буде добре працювати.

Але якщо у вас є два списки, такі:

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

Якщо ви set(a)==set(b)поставите прапорець , він з’явиться як помилковий, але якщо ви зробите наступне:

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

Тепер результат буде правдою.


Небезпека, небезпека. Ніколи не слід кодувати Unicode ( str()або u'€'.encode()), не передаючи кодування. Якщо рядок містить не-ASCII, користувач отримає UnicodeEncodeException.
Аластер Маккормак

3
Крім того, ваш код не працює. b = str(b)просто дає рядок repr()списку, тобто b = "[u'co32', u'co36']". Потімset(a)==set(b) = False
Аластер Маккормак
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.