Python 用重音符号将utf-8编码为base64

Python 用重音符号将utf-8编码为base64,python,encoding,utf-8,ascii,base64,Python,Encoding,Utf 8,Ascii,Base64,我有一些数据如下: 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) 这对data1很好。对于data2,编码正常,但是XML

我有一些数据如下:

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)
这对data1很好。对于data2,编码正常,但是XMLRPC返回一个错误,因为它只需要(从API文档中)ISO-8859-1(拉丁文1)字符。

我的问题是:如何将字符串转换为拉丁文1,以便API接受它?

首先确保您没有对编码等感到困惑。例如,请阅读

然后请注意,主要问题不是base64编码,而是您试图将字节字符串(Python2.x中的普通字符串)放入Unicode字符串中。我相信您可以通过从示例代码的最后一个字符串中删除“u”来解决此问题。

这似乎有效:

base64.b64encode("Hi, %s! Your code is %s" % (data[0].decode('utf8').encode('latin1'), data[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 ..
一些python(2.X)unicode读物:


感谢您的快速回复!我犯了个愚蠢的错误。我改变了这一点,现在API说我应该只使用ISO-8859-1字符;我相应地更新了问题。不客气。但是现在你把以前的答案都和这个问题无关了。是的,我很抱歉,答案太快了+1有用的linkStrict ASCII的一个是7位代码集,因此不能包含0xC3或0xA9等字节。然而,我不清楚为什么会涉及ASCII编解码器——或者,现在,为什么它会存在(或者,它的存在可能是好的,但在没有明确请求的情况下不应该使用它)。这似乎是可行的(对我来说也是)。另一个子问题:似乎重音字符也应该组合(而不是像上面的例子那样的两个实体)。公认的重音字符(ISO-8859-1 DEC)为232、233、236、242、224。如何将字符串中的重音字符转换为相应的(可接受的)值?(另外:我是否应该将此作为一个新问题发布?)。回想一下,utf8可以使用1-4个字节来表示一个字符(与latin1中1个字符==1个字节的旧编码不同)。您是对的,事实上它被正确转义到DEC 233。我无法理解为什么XMLRPC仍然拒绝它(因为手册上说这些代码是可以的),最重要的是,这超出了这个问题的范围。