Кодирование utf-8 в base64 с ударением - PullRequest
0 голосов
/ 15 декабря 2009

У меня есть такие данные:

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

Я использую API, который ожидает данные, закодированные в base64, поэтому я делаю следующее:

data = data1
string = base64.b64encode("Hi, %s! Your code is %s" % (data[0], data[0]))
myXMLRPCCall(string)

Что отлично работает с данными1. С data2 кодировка идет нормально, но затем XMLRPC возвращает ошибку, так как ожидает (из документов API) только ISO-8859-1 (Latin1) символов. У меня вопрос: как я могу преобразовать свою строку в Latin1, чтобы ее принял API?

Ответы [ 3 ]

1 голос
/ 15 декабря 2009
base64.b64encode("Hi, %s! Your code is %s" % (data[0].decode('utf8').encode('latin1'), data[0]))
1 голос
/ 15 декабря 2009

Сначала убедитесь, что вас не смущают кодировки и т. Д. Прочитайте, например, this .

Затем обратите внимание, что основная проблема не в кодировке base64, а в том, что вы пытаетесь поместить байтовую строку (обычную строку в Python 2.x) в строку Unicode. Я полагаю, что вы можете это исправить, удалив "u" из последней строки в вашем примере кода.

0 голосов
/ 15 декабря 2009

Это похоже на работу:

...

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 ..

Некоторые чтения юникода в Python (2.X)

...