2017-02-06 1 views
1

나는 다음과 같이 문자를 유니 코드 이스케이프 코드를 반환하는 파이썬 문자열의 encode 방법을 사용하는 것을 시도하고있다 : 이것은 비 ASCII 문자로 잘 작동파이썬 '.encode ('unicode_escape ')를 사용하여 ascii의 이스케이프 코드를 반환하려면 어떻게해야합니까?

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

하지만, ASCII 문자, 그것은 단지를 반환 아스키 문자 자체 :

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

원하는 출력은 \u0066입니다. 이 스크립트는 교육적인 목적을위한 것입니다.

모든 문자에 대해 유니 코드 16 진 코드를 얻으려면 어떻게해야합니까?

+0

'f'가 '다른 무엇을 반환하는 예상합니까? –

+0

수 없습니다. 'unicode_escape'는 인쇄 가능한 ASCII 문자를 절대 이스케이프하지 않습니다. 너 여기서 뭘하려고하는거야? 즉, 실제 목표는 무엇입니까? –

+0

@MartijnPieters 위의 수정 사항을 참조하십시오. 이 스크립트는 교육적인 목적을위한 것이며,'f'의 결과는'\ u0066'입니다. – reynoldsnlp

답변

2

요청하신 내용이 이상합니다. 파이썬에서는 대개 대신 ord을 사용합니다. 여기서 인코딩/디코딩을 할 필요가 없습니다.

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

감사합니다. 16 진수 형식의 '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 
관련 문제