Как действительно преобразовывают управляющих последовательность Unicode в unicode символы в строке Python

1115 Я бы сказал, что любая опасность затмевается успехами. Хотя есть некоторые, в основном связанные с рефакторингом.

  • переименование классов влияет на все предварительные объявления. Это, конечно, также входит с включениями, но ошибка генерируется в другом месте, так что ее сложнее обнаружить.
  • перемещение классов из namespace в другое в сочетании с директивами using может привести к хаосу (загадочные ошибки, которые трудно обнаружить и исправить) - конечно, директивы using плохи для начала, но нет идеального кода, верно? *
  • шаблоны - для пересылки объявленных шаблонов (особенно пользовательских) вам понадобится подпись, что приведет к дублированию кода.

Рассмотрим

template class Y;
int main()
{
    Y<> * y;
}

//actual definition of the template
class Z
{  
};
template //vers 1.1, changed the default from int to Z
class Y
{};

Класс Z впоследствии был изменен как аргумент шаблона по умолчанию, но исходное прямое объявление все еще с int.

* Я недавно столкнулся с этим:

Оригинал:

Определение:

//3rd party code
namespace A  
{
   struct X {};
}

и предварительное объявление:

//my code
namespace A { struct X; }

После рефакторинга:

//3rd party code
namespace B
{
   struct X {};
}
namespace A
{
   using ::B::X;
}

Это, очевидно, сделало мой код недействительным, но ошибка была не в том месте, и исправление было, по меньшей мере, подозрительным.

28
задан martineau 25 February 2019 в 13:23
поделиться

2 ответа

Предполагая, что Python видит имя как обычную строку, вам сначала нужно декодировать его в Unicode:

>>> name
'Christensen Sk\xf6ld'
>>> unicode(name, 'latin-1')
u'Christensen Sk\xf6ld'

Другой способ добиться этого:

>>> name.decode('latin-1')
u'Christensen Sk\xf6ld'

Обратите внимание на букву «u» перед строки, сигнализируя о том, что она не закодирована. Если вы напечатаете это, акцентированная буква будет отображаться правильно:

>>> print name.decode('latin-1')
Christensen Sköld

BTW: при необходимости вы можете использовать метод de "encode", чтобы превратить Unicode, например, в строку UTF-8:

>>> name.decode('latin-1').encode('utf-8')
'Christensen Sk\xc3\xb6ld'
30
ответ дан 28 November 2019 в 03:22
поделиться

Я подозреваю, что он действительно работает правильно. По умолчанию Python отображает строки в кодировке ASCII, поскольку не все терминалы поддерживают Unicode. Однако если вы действительно напечатаете строку, она должна сработать. См. Следующий пример:

>>> u'\xcfa'
u'\xcfa'
>>> print u'\xcfa'
Ïa
7
ответ дан 28 November 2019 в 03:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: