【发布时间】:2026-02-10 20:15:01
【问题描述】:
我有一个使用 requests module 从 web 服务检索到的 unicode 字符串,其中包含二进制文档的字节(PCL,碰巧)。其中一个字节的值为 248,尝试对其进行 base64 编码会导致以下错误:
In [68]: base64.b64encode(response_dict['content']+'\n')
---------------------------------------------------------------------------
UnicodeEncodeError Traceback (most recent call last)
C:\...\<ipython-input-68-8c1f1913eb52> in <module>()
----> 1 base64.b64encode(response_dict['content']+'\n')
C:\Python27\Lib\base64.pyc in b64encode(s, altchars)
51 """
52 # Strip off the trailing newline
---> 53 encoded = binascii.b2a_base64(s)[:-1]
54 if altchars is not None:
55 return _translate(encoded, {'+': altchars[0], '/': altchars[1]})
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf8' in position 272: ordinal not in range(128)
In [69]: response_dict['content'].encode('base64')
---------------------------------------------------------------------------
UnicodeEncodeError Traceback (most recent call last)
C:\...\<ipython-input-69-7fd349f35f04> in <module>()
----> 1 response_dict['content'].encode('base64')
C:\...\base64_codec.pyc in base64_encode(input, errors)
22 """
23 assert errors == 'strict'
---> 24 output = base64.encodestring(input)
25 return (output, len(input))
26
C:\Python27\Lib\base64.pyc in encodestring(s)
313 for i in range(0, len(s), MAXBINSIZE):
314 chunk = s[i : i + MAXBINSIZE]
--> 315 pieces.append(binascii.b2a_base64(chunk))
316 return "".join(pieces)
317
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf8' in position 44: ordinal not in range(128)
我觉得这有点令人惊讶,因为 248 在无符号字节的范围内(并且可以保存在字节字符串中),但我真正的问题是:什么是最好或正确的方法来编码这个字符串?
我目前的解决方法是:
In [74]: byte_string = ''.join(map(compose(chr, ord), response_dict['content']))
In [75]: byte_string[272]
Out[75]: '\xf8'
这似乎可以正常工作,并且生成的 byte_string 能够进行 base64 编码,但似乎应该有更好的方法。有吗?
【问题讨论】:
-
248 可能在无符号字节范围内,但不在标准化 ASCII [0-127] 范围内。
-
@Cameron:一个正确的观点,但它仍然不能解释问题,因为完全相同的值,当保存在字节字符串中时不会导致该错误。
-
查看我的答案 :-) 您所做的是获取
unicode字符串的代码点并将它们视为字节。这……充其量是可疑的,因为您无法保证代码点甚至在 0-255 范围内。更糟糕的是,以后没有其他人会知道如何解释字节字符串,因为它是在自定义的、未定义的编码中。 -
@Cameron:重申一下:这些数据不是字符代码点,它们是二进制数据。
标签: python character-encoding base64 unicode-string python-unicode