Bytearray编码成UTF8

2024-09-28 05:25:33 发布

您现在位置:Python中文网/ 问答频道 /正文

因此,在Python 2.7中,我有一个字符串:

Python 2.7.8 (default, Apr 15 2015, 09:26:43) 
[GCC 4.9.2 20150212 (Red Hat 4.9.2-6)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import scrypt
>>> s=scrypt.encrypt('somestring', 'test'.encode('ascii'), 0.1)
>>> s
'scrypt\x00\r\x00\x00\x00\x08\x00\x00\x00\x016 \xf2\xcc\xf9\xd2\xbe\xd4\xdbU!\xaf\xecKk{\x8b\r\x94\xe8\x11\xf2\x00\x1f\xd9\xceBhf$cM\x12{\xd8\x84\\\xf2j`\xba\xc5Xk\x196)\xf5\xd3\xe9\x15\xdd\xd3\xa0A_K\x00\x18\x03J\x85\xee\n\xcc\xea\x86\xda\xaa\xfd6E\xf4\x804\xfe\x04\xca\xec!\x94F\x84)B\tf\x07\xd9!@B,\x9e\xffc\xf2\xb6e\x8c\xa9HA\x98\x99\xa0\xe8\xcf\x85P2\x13\x0f\xa1\xf6\x90nO\x85Z\xb2\xc1'
>>> type(s)
<type 'str'>

(真难看。)

我需要把它编码成文本-要么是unicode对象,要么是utf-8字符串。在

^{pr2}$

问题是,它超出了UTF-8的范围:

>>> s.encode('utf-8')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xf2 in position 18: ordinal not in range(128)

那么:我应该如何编码这个字符串?在

如果您能告诉我为什么ascii编解码器在我试图对字符串进行编码时出现错误(以及所有事情的UnicodeDecodeError)的原因,那么您将获得额外的奖励。在

(需要注意的是,尝试编码为UTF-16会引发完全相同的错误。)

我已经让它和base64一起工作了(我想,这就是它的用途),但是我很好奇为什么会出现这个错误,以及我的选择是什么。在


Tags: 字符串in编码type错误asciiencodescrypt
2条回答

你有二进制数据。不是文本,当然也不是Unicode。不能将其编码为UTF-8,因为它不是unicode(文本)对象。在

您的UnicodeDecodeError是由于Python试图先对数据进行解码而导致的;它试图提供帮助,因为通常只能从Unicode编码到字节。由于您尝试在字节上执行此操作,它首先需要将字节解码为Unicode,然后使用ASCII编解码器进行解码。但是你没有ASCII数据,也没有其他文本编码。在

不能用这些字节生成Unicode,因为它是而不是text。您唯一的选择是使用像base64这样的二进制到文本方案,它以一种安全的方式包装二进制数据,以便通过期望文本的系统进行传输(因此不支持\x00NUL字节或\x0a新行或在文本流中具有特殊含义的其他字节)。在

请参阅^{} library,了解Python标准库中可用的各种二进制到文本模式;base64是其中使用最广泛的一种。在

一般的答案是你不能-你的通用二进制数据可能包含无效的utf-8字节序列。但是,根据您的应用程序,也许您可以使用二进制到文本的编码(例如base64)将数据存储在任何需要的地方,然后在检索时对其进行解码?在

参考文献: https://en.wikipedia.org/wiki/Base64

https://docs.python.org/2/library/base64.html

相关问题 更多 >

    热门问题