2017-02-06 36 views
1

Я пытаюсь использовать encode метод питон строк возвращать коды Юникода спасайте символы, например:Как я могу получить python '.encode (' unicode_escape ') для возврата escape-кодов для ascii?

>>> print('ф'.encode('unicode_escape').decode('utf8')) 
\u0444 

Это отлично работает с не-ASCII символами, но и для символов ASCII, он просто возвращает сами символы ascii:

>>> print('f'.encode('unicode_escape').decode('utf8')) 
f 

Желаемый результат будет \u0066. Этот сценарий предназначен для педагогических целей.

Как получить шестнадцатеричные коды Unicode для ВСЕХ символов?

+0

что еще вы ожидаете ' 'f'', чтобы вернуться? –

+0

Вы не можете. 'unicode_escape' никогда не удалит печатные символы ASCII. Что вы здесь делаете? Другими словами, какова действительная цель *? –

+0

@MartijnPieters См. Правки выше. Сценарий предназначен для педагогических целей, а выход для 'f' будет' \ u0066'. – reynoldsnlp

ответ

2

Ваш запрос выглядит странно. В Python обычно мы использовали бы вместо этого ord. Здесь нет необходимости в кодировании/декодировании.

>>> '"\\U{:08x}"'.format(ord('f')) # ...or \u{:04x} if you prefer 
'"\\U00000066"' 
>>> eval(_) 
'f' 
+0

Спасибо! Комбинация 'ord' и' x' спецификации для шестнадцатеричного формата, кажется, работает отлично. – reynoldsnlp

1

Вам нужно будет сделать это вручную; если вы предполагаете, что весь ваш вход находится в пределах BMP Юникода, то, по-видимому, быстрое регулярное выражение будет самым быстрым; это заменяет каждый символ с их \uhhhh побега:

import re 

def unicode_escaped(s, _pattern=re.compile(r'[\x00-\uffff]')): 
    return _pattern.sub(lambda m: '\\u{:04x}'.format(
     ord(m.group(0))), s) 

Я явно ограничивали шаблон в BMP корректно обрабатывать не-BMP точек.

Демо:

>>> print(unicode_escaped('foo bar ф')) 
\u0066\u006f\u006f\u0020\u0062\u0061\u0072\u0020\u0444