내 python3 스크립트는 파이프를 통해 C ++ 프로그램에서 문자열을받습니다. 유니 코드 코드 포인트를 통해 인코딩 된 문자열. 올바르게 디코딩해야합니다.
예를 들어, 키릴 기호가 포함 된 문자열을 고려하십시오. 'тест test'
python3 :을 사용하여이 문자열을 인코딩 해보십시오 print('тест test'.encode())
. 우리는b'\xd1\x82\xd0\xb5\xd1\x81\xd1\x82 test'
C ++ 프로그램은이 문자열을 다음과 같이 인코딩합니다. b'\u00D1\u0082\u00D0\u00B5\u00D1\u0081\u00D1\u0082 test'
인코딩 된 문자열은 매우 비슷해 보입니다. python3은 \x
(2 비트)를 사용하고 C ++ 프로그램은 \u
(4 비트)를 사용합니다 . 그러나 나는 변환하는 방법을 알아낼 수 없습니다 b'\u00D1\u0082\u00D0\u00B5\u00D1\u0081\u00D1\u0082 test'
에 'тест test'
. 주요 문제-python3 b'\u00D1\u0082\u00D0\u00B5\u00D1\u0081\u00D1\u0082'
은 8 자 문자열로 간주 하지만 4 자만 포함합니다.
C ++에서받은 문자열이 Python에서 다음과 같은 경우 :
s = b'\u00D1\u0082\u00D0\u00B5\u00D1\u0081\u00D1\u0082 test'
그런 다음 디코딩합니다.
result = s.decode('unicode-escape').encode('latin1').decode('utf8')
print(result)
산출:
тест test
첫 번째 단계는 수신 된 바이트 문자열을 유니 코드 문자열로 변환합니다.
>>> s1 = s.decode('unicode-escape')
>>> s1
'Ñ\x82еÑ\x81Ñ\x82 test'
불행히도 유니 코드 코드 포인트는 실제로 UTF-8 바이트 값입니다. latin1
그래서 코드 포인트 바이트 열에서 바이트 값으로 다시 변환이 코덱으로 코딩하는, 제 256 개 유니 코드 코드 포인트 1 매핑 : 부호화는 1 :
>>> s2 = s1.encode('latin1')
>>> s2
b'\xd1\x82\xd0\xb5\xd1\x81\xd1\x82 test'
이제 바이트 문자열을 올바른 유니 코드 문자열로 디코딩 할 수 있습니다.
>>> s3 = s2.decode('utf8')
>>> s3
'тест test'
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다