(ошибка Unicode) кодек unicodeescape не может декодировать байты - строка с '\ u'

Я пишу свой код для Python 2.6, но, имея в виду Python 3, я подумал, что было бы неплохо поместить

from __future__ import unicode_literals

в начало некоторых модулей. Другими словами, я прошу неприятностей (чтобы избежать их в будущем), но, возможно, мне здесь не хватает некоторых важных знаний. Я хочу иметь возможность передать строку, представляющую путь к файлу, и создать экземпляр объекта так же просто, как

MyObject ('H: \ unittests')

В Python 2.6 , это работает нормально, нет необходимости использовать двойную обратную косую черту или необработанную строку, даже для каталога, начинающегося с '\ u ..' , что мне и нужно. В методе __ init __ я проверяю, что все одиночные вхождения \ интерпретируются как ' \\ ', включая те, которые находятся перед специальными символами, как в \ a , \ b , \ f , \ n , \ r , \ t и ] \ v (проблемой остается только \ x ). Также декодирование данной строки в Unicode с использованием (локальной) кодировки работает должным образом.

Подготовка к Python 3.x , имитация моей реальной проблемы в редакторе (начиная с чистой консоли в Python 2.6), происходит следующее:

>>> '\u'
'\\u'
>>> r'\u'
'\\u'

(ОК, пока здесь: ' \ u ' кодируется консолью с использованием локальной кодировки)

>>> from __future__ import unicode_literals
>>> '\u'
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 0-1: end of string in escape sequence

Другими словами, строка (unicode) вообще не интерпретируется как unicode и не декодируется автоматически с помощью локальной кодировки. Даже в этом случае для необработанной строки:

>>> r'\u'
SyntaxError: (unicode error) 'rawunicodeescape' codec can't decode bytes in position 0-1: truncated \uXXXX

то же самое для u '\ u' :

>>> u'\u'
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 0-1: end of string in escape sequence

Кроме того, я ожидаю, что isinstance (str (''), unicode) вернет Истина (чего нет), потому что импорт unicode_literals должен сделать все строковые типы Unicode. (edit:) Поскольку в Python 3 все строки представляют собой последовательности символов Unicode , я ожидаю, что str ('')) вернет такой unicode- строка и тип (str ('')) должны быть как , так и (поскольку все строки являются unicode), но также следует понимать, что не является . Кругом неразбериха ...

Вопросы

  • , как лучше всего передать строки, содержащие ' \ u '? (без записи ' \\ u ')
  • действительно ли from __future__ import unicode_literals реализуют все изменения Unicode, связанные с Python 3., чтобы я получил полную строковую среду Python 3?

edit: В Python 3 является объектом Unicode , а просто не существует. В моем случае я хочу написать код для Python 2 (.6), который будет работать в Python 3. Но когда я импортирую unicode_literals , я не могу проверить, имеет ли строка потому что:

  • Я предполагаю, что unicode не является частью пространства имен
  • , если unicode является частью пространства имен, литерал по-прежнему является Unicode, когда он создается в том же модуле
  • type (mystring) всегда будет возвращать для литералов Unicode в Python 3

Мои модули кодируются в 'utf-8' с помощью комментария # coding: UTF-8 вверху, а мой locale.getdefaultlocale () [1] возвращает ' cp1252 '.Поэтому, если я вызываю MyObject ('çça') с моей консоли, он кодируется как 'cp1252' в Python 2 и как 'utf-8' при вызове MyObject ('çça') из модуля. В Python 3 он не будет закодирован, а будет литералом Unicode.

править:

Я отказался от надежды на то, что мне позволят избежать использования '\' перед u (или x , если на то пошло). Также я понимаю ограничения импорта unicode_literals . Тем не мение,множество возможных комбинаций передачи строки из модуля в консоль и наоборот с каждой другой кодировкой, а также импорт unicode_literals или нет и Python 2 против Python 3, заставили меня захотеть создать обзор фактического тестирования. Отсюда и таблица ниже. enter image description here

Другими словами, type (str ('')) не возвращает в Python 3, но , и, похоже, удалось избежать всех проблем Python 2.

24
задан Remi 3 October 2011 в 12:09
поделиться