【问题标题】:Encoding utf-8 to base64 with accents使用重音符号将 utf-8 编码为 base64
【发布时间】:2009-12-15 15:02:17
【问题描述】:

我有一些这样的数据:

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 (Latin1) 字符。
我的问题是:如何将我的字符串转换为 Latin1 以便 API 接受它?

【问题讨论】:

  • 严格 ASCII 是 7 位代码集,因此不能包含 0xC3 或 0xA9 等字节。但是,我不清楚为什么涉及 ASCII 编解码器 - 或者,这些天,它为什么存在(或者,它的存在可能很好,但不应该在没有明确要求的情况下使用它)。

标签: python encoding utf-8 ascii base64


【解决方案1】:
base64.b64encode("Hi, %s! Your code is %s" % (data[0].decode('utf8').encode('latin1'), data[0]))

【讨论】:

  • 这似乎有效(也:对我来说,duh)。另一个子问题:似乎重音字符也应该组合起来(而不是像上面的例子那样两个实体)。接受的重音字符 (ISO-8859-1 DEC) 是 232、233、236、242、224。如何将字符串中的重音字符转换为相应的(接受的)值? (另外:我应该将此作为一个新问题发布吗?)
  • 我相信这两个转义值是指在 utf8 (DEC 233) 中包含单个字符的两个字节。回想一下,utf8 可以使用 1-4 个字节来表示一个字符(与 latin1 等较旧的编码相比,其中 1 个字符 == 1 个字节)。
  • 你是对的,事实上它被正确地转义到了 DEC 233。为什么 XMLRPC 仍然拒绝它(因为手册说这些代码是好的)超出了我的范围,最重要的是超出了这个问题。
【解决方案2】:

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

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

【讨论】:

  • 感谢您的快速回复!这对我来说是一个愚蠢的错误。我改变了它,现在 API 说我应该只使用 ISO-8859-1 字符;我相应地更新了问题。
  • 不客气。但是现在您使之前的所有答案都与问题无关。
  • 是的,我很抱歉,答案太快了! +1 一个有用的链接
【解决方案3】:

这似乎有效:

...

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 读数:

【讨论】:

    猜你喜欢
    • 2016-10-14
    • 1970-01-01
    • 2021-11-17
    • 2013-12-28
    • 2014-10-18
    • 2010-10-09
    • 1970-01-01
    • 1970-01-01
    • 2011-08-09
    相关资源
    最近更新 更多