2009-12-15 1 views
0

액센트 :인코딩 UTF-8베이스 64에 좀 이런 데이터가

data = data1 
string = base64.b64encode("Hi, %s! Your code is %s" % (data[0], data[0])) 
myXMLRPCCall(string) 
: 내가 base64로 인코딩 데이터, 그래서 내가 무엇을 기대 API를 사용하고

data1 = ['Agos', '30490349304'] 
data2 = ['Desir\xc3\xa9','9839483948'] 

데이터 1에서 잘 작동합니다. data2를 사용하면 인코딩은 정상적으로 처리되지만 XMLRPC는 (API 문서에서) ISO-8859-1 (Latin1) 문자 만 필요하므로 오류를 반환합니다.
내 질문은 : 어떻게 API를 받아 들일 수 있도록 Latin1로 내 문자열을 변환 할 수 있습니까?

+0

엄격한 ASCII는 7 비트 코드 집합이므로 0xC3 또는 0xA9와 같은 바이트를 포함 할 수 없습니다. 그러나 왜 ASCII 코덱이 전혀 관련되어 있지 않은지, 요즘 왜 존재하는지 (또는 존재할 수도 있지만, 명시 적으로 요청하지 않고서는 안된다) 분명하지 않습니다. –

답변

1
base64.b64encode("Hi, %s! Your code is %s" % (data[0].decode('utf8').encode('latin1'), data[0])) 
+0

이것은 작동하는 것 같습니다 (또한 : 나를 위해 duh). 또 다른 하위 질문 : 악센트 부호가있는 문자가 결합되어야합니다 (위의 예와 같은 두 개의 엔티티 대신). 허용되는 악센트 부호가있는 문자 (ISO-8859-1 DEC)는 232, 233, 236, 242, 224입니다. 문자열의 악센트 부호가있는 문자를 해당하는 (허용 된) 값으로 변환하려면 어떻게해야합니까? (또한 : 새로운 질문으로 게시해야합니까?) – Agos

+0

두 이스케이프 된 값은 utf8 (DEC 233)에서 단일 문자를 구성하는 두 바이트를 참조합니다. utf8은 문자를 나타 내기 위해 1-4 바이트를 사용할 수 있습니다 (1 문자 == 1 바이트 인 latin1과 같은 이전 인코딩과 달리). –

+0

네가 맞다. 실제로 DEC 233으로 정확히 이스케이프 처리된다. XMLRPC가 여전히이 코드를 거부하는 이유는 (매뉴얼에이 코드가 맞다고 말했기 때문에) 나를 넘어서서 가장 중요한 것은이 SO 질문의 범위를 벗어난다. – Agos

1

먼저 인코딩 등을 혼동하지 않도록하십시오 (예 : this).

그런 다음 기본 문제는 base64 인코딩과 다르지만 바이트 문자열 (일반 문자열은 Python 2.x에 넣음)을 유니 코드 문자열에 넣으려고합니다. 귀하의 예제 코드에서 마지막 문자열에서 "u"를 제거하여이 문제를 해결할 수 있다고 생각합니다.

+0

빠른 답장을 보내 주셔서 감사합니다! 그건 내 멍청한 실수 였어. 그 점을 변경했는데 API에서 ISO-8859-1 문자 만 사용해야한다고합니다. 그에 따라 질문을 업데이트했습니다. – Agos

+1

반갑습니다. 그러나 이제는 그 질문과 관련이없는 이전의 모든 대답을 만들었습니다. – Amnon

+0

예, 죄송합니다. 답변이 너무 빠릅니다! 유용한 링크 +1 +1 – Agos

0

이 제대로 작동 :

... 

data = data2 
base64.b64encode("Hi, %s! Your code is %s" % (data[0], data[0])) 
# => 'SGksIERlc2lyw6khIFlvdXIgY29kZSBpcyBEZXNpcsOp' 

# I can't test the XMLRPC parts, so this is just a hint .. 
for_the_wire = base64.b64encode("Hi, %s! Your code is %s" % (data[0], data[0])) 
latin_1_encoded = for_the_wire.encode('latin-1') 

# send latin_1_encoded over the wire .. 

일부 파이썬 (2.X) 유니 코드 읽기 :