Вы должны префиксировать все строковые литералы с 'u'
Нет, не совсем.
Вы должны префиксировать литералы для строк символов с u
.Но не все строки являются строками символов.Когда вы говорите с компонентами, основанными на байтах, такими как сетевые службы или двоичные файлы, вам необходимо использовать байтовые строки.
например.Хотите попробовать записать строку Unicode в файл PNG?Не разумноХотите base64-декодировать строку Y2Fm6Q==
?Вы не можете разумно использовать строку Unicode здесь, base64 явно байты.
Конечно, Python часто позволяет вам избежать передачи строки Unicode, где ожидается строка байта, но только путем автоматического кодирования в ASCII,Если строка содержит не-ASCII-символы, вы получите UnicodeError
точно так же, как если бы вы использовали байты там, где ожидался Unicode.«Юникод правильный, байты неправильные» - разрушительный миф.Требуется манипулирование для обоих типов строк.
Если вы обеспокоены переходом на Python 3, вам, безусловно, следует пометить строки символов как u''
, но затем вы также должны отметить свои явно байтыстроки как b''
.Строки, где не имеет значения, вы можете оставить как ''
и позволить им преобразовываться из байтовых строк в строки Unicode на Python 3. Есть много случаев, когда Python 2 использовал байты, а Python 3 использовал Unicode там, где это уместно.сделать это.Но есть еще много случаев, когда вам действительно нужно говорить байты, и преобразование этого в Python 3 в качестве юникода вызовет проблемы.
(Единственная проблема с этим состоит в том, что синтаксис b''
требует Python2.6 или более поздней, поэтому его использование сделает вас несовместимым с более ранними версиями.)