2015-08-15 45 views
0

因此,在Python 2.7我有一个字符串:(这是真实的丑陋)编码的ByteArray为UTF-8

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\[email protected],\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字符串。

TypeError: You are required to pass either a unicode object or a utf-8 string here. 
You passed a Python string object which contained non-utf-8: 
'scrypt\x00\r\x00\x00\x00\x08\x00\x00\x00\x01\xce\xf5\xba\x19\xeb1z/5*`m\xec\xf6sgT4\xb5.\xf7^\x96\xfaMY6\xa0\xdb\t\xa3*<5A<\xfb\xbe\xfb>w\xa3,MjaX;\xc1r\xdc\xbd\x04W\xafq3O\x90\x19!\x13\xe8\x0c\x86\xf5\xc96\xf4K\x16\xe3^.v\x8a\xe0\xda\xdd>#\xa7\\\x1c\xc2\x11\x85\x01\xb5\xd4\x92\xef\xa1k\x05Z\xaey\xd7M`%5.\x9f\xb1\xc4\x11N\xdeY\xa2\xac=\r\n\xb4aM\xfd)\xcc$\xbbq\xaa\xfd\x9d \xa5\xd39|\x85\xc8\x95\xbc\xfa\x17\xa1\x8e\xb8\x81 \xb4\x9b>j'. 
The UnicodeDecodeError that resulted from attempting to interpret it as utf-8 was: 
'utf8' codec can't decode byte 0xce in position 20: invalid continuation byte 

的问题是,它是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工作(这是我想,那是什么的),但我m好奇为什么我得到这个错误和我的选择是什么。

+3

你有二进制数据而不是文本,肯定不是Unicode你。不能将它编码为UTF-8,因为它不是一个“unicode”(文本)对象。为什么你认为你需要编码? –

+0

肯定不会加密它并把它扔到互联网上,这会是可疑的。 ) – DNelson

+0

(真实)加密算法在字节上工作,而不是文本。 –

回答

3

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

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

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

在Python标准库提供的各种二进制到文本方案见binascii library; Base64是最广泛使用的这些

1

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

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

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

+0

正如我在问题中提到的,我已经得到了这个与base64一起工作,但我更加好奇的错误信息,它的含义和其他选项(如果有的话)除了b64。 – DNelson

+0

https://en.wikipedia.org/wiki/UTF-8#Invalid_byte_sequences应该可以帮助你理解 –