2017-03-14 10 views
3

이 같은 여러 개의 16 진수 값을 요구하는 문자로 문자열을 변환하려고에 \ xHH 16 진수 값을 가진 문자열 :파이썬 3 - 유니 코드

'Mahou Shoujo Madoka\xe2\x98\x85Magica' 

의 유니 코드 표현으로 :

'Mahou Shoujo Madoka★Magica' 

내가

x = 'Mahou Shoujo Madoka\xe2\x98\x85Magica' 
print(x) 

Mahou Shoujo MadokaâMagica 

그래서 : 나는 문자열을 인쇄 할 때, 그것은 기본적으로 나는이를 얻을 수 있도록, 개별적으로 각 16 진수 값을 평가하려고

x = 'Mahou Shoujo Madoka\xe2\x98\x85Magica' 
z = x.encode('utf-8') 
print('z:', z) 
y = z.decode('utf-8') 
print('y:', y) 

z: b'Mahou Shoujo Madoka\xc3\xa2\xc2\x98\xc2\x85Magica' 
y: Mahou Shoujo MadokaâMagica 

Python: Convert Unicode-Hex-String to Unicode : 같은 Best way to convert string to bytes in Python 3? 같은 다른 StackOverflow의 답변, 시도

z = 'Mahou Shoujo Madoka\xe2\x98\x85Magica' 
x = binascii.unhexlify(binascii.hexlify(z.encode('utf-8'))).decode('utf-8') 
print('x:', x) 

x: Mahou Shoujo MadokaâMagica 

그리고 일부 다른,하지만 그들 중 누구도 일했다. 내가 찾은 대부분의 결과는 double backslash problem 사람 이었지만 그 중 누구도 정확한 문제가 없었습니다.

str.encode를 할 때 첫 번째 시도에서 z와 x의 차이와 같은 바이너리에 추가 값을 추가하는 것처럼 보입니다. 이유는 확실하지 않습니다.

그래서 수동으로 바이너리로 문자열의 문자를 입력하려고 :

x = b'Mahou Shoujo Madoka\xe2\x98\x85Magica' 
x.decode('utf-8') 

'Mahou Shoujo Madoka★Magica' 

그것은했다. 그러나 문자열을 이진 문자로 변환하는 방법을 찾지 못했습니다. 내가 어디로 잘못 가고 있니?

답변

3

파이썬 3에서는 원래 문자열이 유니 코드 문자열이지만 UTF-8처럼 보이지만 부정확하게 디코딩 된 유니 코드 코드 포인트를 포함합니다. 그것을 해결하기 :

>>> s = 'Mahou Shoujo Madoka\xe2\x98\x85Magica' 
>>> type(s) 
<class 'str'> 
>>> s.encode('latin1') 
b'Mahou Shoujo Madoka\xe2\x98\x85Magica' 
>>> s.encode('latin1').decode('utf8') 
'Mahou Shoujo Madoka★Magica' 

latin1 부호화 1 매핑 발생 유니 코드의 첫 번째 256 개의 코드 포인트 1을하므로 .encode('latin1') 직접 위로 바이트 코드 포인트 변환한다. 그런 다음 .decode('utf8') 바이트를 올바르게 처리 할 수 ​​있습니다.

+0

문자열을 변수에 할당하려면 위의 내용을's = b "\ xe2 \ x98 \ x85".decode ("utf8")'로 줄이십시오. – Jens

+0

@Jens 당신은's = '★''로 단축 할 수 있습니다. 그러나 그것은 질문의 요점이 아니 었습니다. –