2014-10-28 1 views
0

유니 코드 입력을 UTF-8 바이트 시퀀스의 \ x 이스케이프 처리 된 7 비트 ASCII 재배치로 변환하려고합니다. 어떻게 파이썬에서 x-escaped UTF-8을 생성 할 수 있습니까?

내가 대신 "\u222a"의 필요 내가 원하는 결과를 생성하는 것처럼이 보이는 "\xe2\x88\xaa"

>>> codecs.encode(u"\u222A", 'ascii', 'backslashreplace') 
'\\u222a' 

생성하고자하는 유사합니다 :

>>> u"\u222A".encode('utf-8') 
'\xe2\x88\xaa' 

을하지만 그것은 단지입니다 이스케이프 된 표현.

을 :에 repr가 추가하는 선행 및 후행 따옴표를 제거, 나는 그게 내가 원하는 것을 얻을 표현을 탈출 남용 할 수

>>> [ord(c) for c in u"\u222A".encode('utf-8')] 
[226, 136, 170] 

: 실제 결과는 3 UTF-8 바이트의 12 ASCII 바이트 아니다

>>> repr(u"\u222A".encode('utf-8'))[1:-1] 
'\\xe2\\x88\\xaa' 
>>> [ord(c) for c in repr(u"\u222A".encode('utf-8'))[1:-1]] 
[92, 120, 101, 50, 92, 120, 56, 56, 92, 120, 97, 97] 

턱. 조금 나아졌습니다.

>>> import binascii 
>>> ''.join('\\x' + binascii.hexlify(c) for c in u"\u222A".encode('utf-8')) 
'\\xe2\\x88\\xaa' 
>>> [ord(c) for c in ''.join('\\x' + binascii.hexlify(c) for c in u"\u222A".encode('utf-8'))] 
[92, 120, 101, 50, 92, 120, 56, 56, 92, 120, 97, 97] 

더 좋은 방법이 있나요?

+0

은 왜 그런 짓을 했을까? .... 나는 왜 당신이 이것을 원할 것 같은지 이해하지 못한다. .. 어떻게 ... repr에 문제가 있겠는가? 그게 네가 원하는대로하는 것 같아. 난 아직도 왜 세상에서 너는 이것을 원할 것인가를 이해하지 못한다. –

+1

왜 내가 백 슬래시 폼이 필요한지 물으면 마음을 먹을 수 있니? 더 쉬운 방법이 있을지도 모릅니다. 예를 들어,'json.dumps (obj) '를 사용하여 JSON 표현을 생성 할 수 있습니다. –

+0

'repr' 행은 32-127 범위의 12 ASCII 바이트를 제공하여 원하는대로 정확하게 수행합니다. 왜 "Yuck"인가? –

답변

1
>>> u'\u222A'.encode('utf-8').encode('string-escape') 
'\\xe2\\x88\\xaa' 
>>> print u'\u222A'.encode('utf-8').encode('string-escape') 
\xe2\x88\xaa 
+0

''string-escape ''는 Python 3과 호환되지 않습니다.이 외에도 이것은 아주 간단한 방법입니다. –

+0

'3 >> '\ u222''.encode ('utf-8 ') .deode ('latin-1 '). encode ('유니 코드 탈출 ')' 'b '\\ xe2 \\ x88 \\ xaa '' –

0

나는 추한 것이 아닌 해결책을 찾지 못할 것이라고 생각합니다. 다음은 16 진수 시퀀스로 변환하지 않고 원래 문자열에있는 ASCII 문자를 유지하는 코드입니다.

''.join(c if 32 <= ord(c) <= 127 else '\\x{:02x}'.format(ord(c)) for c in u"\u222A".encode('utf-8')) 
+0

리터럴 백 슬래시는 어떻게됩니까? –

관련 문제