문제

XMLRPC를 통해 고객 중 한 명으로부터 얻는 문자열에 문제가 있습니다. 그는 나에게 두 번 인코딩 된 UTF8 문자열을 보냅니다. 그가 수정하기 전에 지금은 빠른 해결 방법을 수행합니다.

TCP 덤프의 원시 문자열 :

<string>Rafa\xc3\x85\xc2\x82</string>

이것은 다음으로 변환됩니다.

u'Rafa\xc5\x82'

우리가 얻는 최고는 다음과 같습니다.

eval(repr(u'Rafa\xc5\x82')[1:]).decode("utf8") 

이것은 올바른 문자열을 초래합니다.

u'Rafa\u0142' 

그러나이 작품은 지옥처럼 못 생겼으며 생산 코드에서 사용할 수 없습니다. 이 문제를보다 적합한 방식으로 해결하는 방법을 알고 있다면 쓰십시오. 고마워요, 크리스

도움이 되었습니까?

해결책

>>> s = u'Rafa\xc5\x82'
>>> s.encode('raw_unicode_escape').decode('utf-8')
u'Rafa\u0142'
>>>

다른 팁

예, 재미 있었어!

>>> original = "Rafa\xc3\x85\xc2\x82"
>>> first_decode = original.decode('utf-8')
>>> as_chars = ''.join([chr(ord(x)) for x in first_decode])
>>> result = as_chars.decode('utf-8')
>>> result
u'Rafa\u0142'

따라서 첫 번째 디코딩을 수행하여 각 문자가 실제로 UTF-8 바이트 값인 유니 코드 문자열을 얻습니다. 당신은 각 캐릭터의 정수 값을 통해 진정한 UTF-8 문자열로 돌아가서 정상적으로 디코딩합니다.

>>> weird = u'Rafa\xc5\x82'
>>> weird.encode('latin1').decode('utf8')
u'Rafa\u0142'
>>>

Latin1은 Richie의 Nuts'n'bolts 방법에 대한 약어입니다.

진지하게 묘사 된 것은 매우 궁금합니다 raw_unicode_escape 코덱은 동일한 결과를 제공합니다 latin1 이 경우. 그들은 항상 같은 결과를 제공합니까? 그렇다면 왜 코덱이 있습니까? 그렇지 않다면 OP의 고객이 어떻게 변환을 수행했는지 정확히 알기가 바람직합니다. 'Rafa\xc5\x82' 에게 u'Rafa\xc5\x82' 그런 다음 해당 프로세스를 정확하게 반전 시키십시오. 그렇지 않으면 이중 인코딩이 고정되기 전에 다른 데이터가 자르면 우리는 계속 될 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top