2009-12-15 29 views
0

我有这样一些数据:编码UTF-8为base64与口音

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

我使用预计base64编码数据,所以我做的是一个API:

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

它可以很好地处理data1。使用data2编码可以,但是XMLRPC会返回一个错误,因为它(仅来自API文档)只有ISO-8859-1(Latin1)字符。
我的问题是:如何将我的字符串转换为Latin1以便API接受它?

+0

严格ASCII是一个7位代码集,因此不能包含诸如0xC3或0xA9的字节。然而,我不清楚为什么ASCII编解码器完全涉及 - 或者,现在甚至存在它的原因(或者,它可能存在,但不应该在没有明确要求的情况下使用)。 –

回答

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

这似乎工作(还:对我来说)。 另一个子问题:似乎重音字符也应该组合(而不是像上面的例子那样的两个实体)。 接受的重音字符(ISO-8859-1 DEC)是232,233,236,242,224。 如何将字符串中的重音字符转换为相应的(接受的)值? (另外:我应该发布这个作为一个新的问题?) – Agos

+0

我相信两个转义值指的是utf8(DEC 233)中包含单个字符的两个字节。回想一下,utf8可以使用1-4个字节来表示一个字符(与latin1中的1个字符== 1个字节等较旧的编码形成对比)。 –

+0

你是对的,实际上它被正确地转义到DEC 233. 为什么XMLRPC仍然拒绝它(因为手册说这些代码是好的)超出了我的范围,最重要的是超出了这个SO问题的范围。 – Agos

1

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

然后注意,主要问题不是base64编码,而是因为你试图在Unicode字符串中放置字节字符串(Python 2.x中的普通字符串)。我相信你可以通过从示例代码中的最后一个字符串中删除“u”来解决这个问题。

+0

感谢您的快速回复!这是我的一个愚蠢的错误。 我改变了,现在API说我应该只使用ISO-8859-1字符;我相应地更新了这个问题。 – Agos

+1

不客气。但是现在你已经做出了与这个问题无关的所有以前的答案。 – Amnon

+0

是的,我很抱歉,答案太快了! +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 .. 

一些Python(2.X)unicode的读数: