Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将字节解码为unicode字符串_Python_Unicode_Python 3.x_Encoding_Utf 8 - Fatal编程技术网

Python 将字节解码为unicode字符串

Python 将字节解码为unicode字符串,python,unicode,python-3.x,encoding,utf-8,Python,Unicode,Python 3.x,Encoding,Utf 8,问题是如何提取字符串,它在字符串中表示为字节(警告)?我的实际意思是: >>> s1 = '\\xd0\\xb1' # But this is NOT bytes of s1! s1 should be 'б'! '\\xd0\\xb1' >>> s1[0] '\\' >>> len(s1) # The problem is here: I thought I would see (2), but: 8 >&

问题是如何提取字符串,它在字符串中表示为字节(警告)?我的实际意思是:

>>> s1 = '\\xd0\\xb1'  #  But this is NOT bytes of s1! s1 should be 'б'!
'\\xd0\\xb1'
>>> s1[0]
'\\'
>>> len(s1)            #  The problem is here: I thought I would see (2), but:
8
>>> type(s1)
<class 'str'>
>>> type(s1[0])
<class 'str'>
>>> s1[0] == '\\'
True
>>s1='\\xd0\\xb1'#但这不是s1的字节!s1应该是“б”!
“\\xd0\\xb1”
>>>s1[0]
'\\'
>>>len(s1)#问题在这里:我以为我会看到(2),但是:
8.
>>>类型(s1)
>>>类型(s1[0])
>>>s1[0]='\\'
符合事实的

因此,我如何将s1转换为'б'(西里尔字母符号-'\xd0\xb1'的真实表示形式)。我已经在这里问了一个类似的问题,但我的错误被误解为对s1的真实表示视图(我认为'\'\''\'\',而不是'\\')。

尝试以下代码。警告,这只是概念的证明。当文本还包含作为非转义序列写入的字符时,必须以更复杂的方式进行替换(我将在需要时稍后显示)。见下面的评论

import binascii

s1 = '\\xd0\\xb1'
print('s1 =', repr(s1), '=', list(s1))            # list() to emphasize what are the characters

s2 = s1.replace('\\x', '')
print('s2 =', repr(s2))

b = binascii.unhexlify(s2)
print('b =', repr(b), '=', list(b))

s3 = b.decode('utf8')
print('s3 =', ascii(s3))

with open('output.txt', 'w', encoding='utf-8') as f:
    f.write(s3)
它在concole上打印:

c:\__Python\user\so20210201>py a.py
s1 = '\\xd0\\xb1' = ['\\', 'x', 'd', '0', '\\', 'x', 'b', '1']
s2 = 'd0b1'
b = b'\xd0\xb1' = [208, 177]
s3 = '\u0431'
它将字符写入
output.txt
文件

问题是这个问题结合了unicode转义和转义二进制值。换句话说,unicode字符串可以包含某种表示二进制值的序列;但是,您不能直接将该二进制值强制输入unicode字符串,因为任何unicode字符实际上都是一个抽象整数,并且整数可以用多种方式表示(作为字节序列)

如果unicode字符串包含转义序列,如
\\n
,则可以使用
字节.decode()的“unicode_转义”规则以不同方式执行。然而,在这种情况下,您需要从ascii转义序列解码,然后从utf-8解码

更新:这里有一个函数,用于将您的字符串类型转换为其他ascii字符(即不仅仅是转义序列)。该函数使用有限自动机——一开始可能看起来太复杂(实际上只是冗长)

还要查看生成的文件内部。删除调试打印。它在控制台上显示以下内容:

c:\__Python\user\so20210201>b.py
0  c == \
1  c == x
2  c == d
3  c == 0
0  c == \
1  c == x
2  c == b
3  c == 1
0  c == w
0  c == h
0  c == a
0  c == t
0  c == e
0  c == v
0  c == e
0  c == r
'\u0431whatever'

请尝试以下代码。警告,这只是概念的证明。当文本还包含作为非转义序列写入的字符时,必须以更复杂的方式进行替换(我将在需要时稍后显示)。见下面的评论

import binascii

s1 = '\\xd0\\xb1'
print('s1 =', repr(s1), '=', list(s1))            # list() to emphasize what are the characters

s2 = s1.replace('\\x', '')
print('s2 =', repr(s2))

b = binascii.unhexlify(s2)
print('b =', repr(b), '=', list(b))

s3 = b.decode('utf8')
print('s3 =', ascii(s3))

with open('output.txt', 'w', encoding='utf-8') as f:
    f.write(s3)
它在concole上打印:

c:\__Python\user\so20210201>py a.py
s1 = '\\xd0\\xb1' = ['\\', 'x', 'd', '0', '\\', 'x', 'b', '1']
s2 = 'd0b1'
b = b'\xd0\xb1' = [208, 177]
s3 = '\u0431'
它将字符写入
output.txt
文件

问题是这个问题结合了unicode转义和转义二进制值。换句话说,unicode字符串可以包含某种表示二进制值的序列;但是,您不能直接将该二进制值强制输入unicode字符串,因为任何unicode字符实际上都是一个抽象整数,并且整数可以用多种方式表示(作为字节序列)

如果unicode字符串包含转义序列,如
\\n
,则可以使用
字节.decode()的“unicode_转义”规则以不同方式执行。然而,在这种情况下,您需要从ascii转义序列解码,然后从utf-8解码

更新:这里有一个函数,用于将您的字符串类型转换为其他ascii字符(即不仅仅是转义序列)。该函数使用有限自动机——一开始可能看起来太复杂(实际上只是冗长)

还要查看生成的文件内部。删除调试打印。它在控制台上显示以下内容:

c:\__Python\user\so20210201>b.py
0  c == \
1  c == x
2  c == d
3  c == 0
0  c == \
1  c == x
2  c == b
3  c == 1
0  c == w
0  c == h
0  c == a
0  c == t
0  c == e
0  c == v
0  c == e
0  c == r
'\u0431whatever'

为什么你要在那里放一个
b
,为什么不把
r
放在原始字符串上?@GamesBrainiac因为它不是原始字符串-反斜杠是有意义的。b使其成为一个字节字符串<代码>\xd0
是一个单字节,值为0xD0。您可以组合它们(使其成为原始字节字符串),但随后会触发与OP相同的错误。谢谢,我不知道这些是字节字符串。非常感谢:)有时到python聊天室来,我相信我们都可以从你们身上学到很多:)这可能是解决问题的方法,但s1理论上可以在附带代码中声明(其他来源,来自互联网等)。问题不在于如何将len==2的“\xd0\xb1”转换为“б”,而在于如何将len==8的“\\xd0\\xb1”转换为“б”,为什么要将
b
放在其中,为什么不将
r
放在原始字符串中?@GamesBrainiac,因为它不是原始字符串-反斜杠是有意义的。b使其成为一个字节字符串<代码>\xd0
是一个单字节,值为0xD0。您可以组合它们(使其成为原始字节字符串),但随后会触发与OP相同的错误。谢谢,我不知道这些是字节字符串。非常感谢:)有时到python聊天室来,我相信我们都可以从你们身上学到很多:)这可能是解决问题的方法,但s1理论上可以在附带代码中声明(其他来源,来自互联网等)。问题不在于如何将len==2的“\xd0\xb1”转换为“б”,而在于如何将len==8的“\\xd0\\xb1”转换为“б”。非常感谢您,这个解决方案适合我!不客气:)不管怎样,你是如何得到转义序列的字符串的?有一个Flask服务器。消息(字符串)在服务器端由RSA密钥加密,并作为二进制数据返回。。。字符串形式(如示例中的s1)。它是在客户端使用Requests包实现的。坏消息:我无法访问服务器源,因此无法更改用于发送加密邮件的格式。更新:有几件事是错过的:1。服务器上使用RSA密钥加密的消息;2.它以字符串格式(如s1)像二进制数据一样发送给客户端;3.在客户端接收并解密;4.结果是s1,我明白了。不管怎样,这不是一种“众所周知”(我不这么认为)的逃避被转移内容的方式吗?如果是的话,可能会有一些模块用于此目的。非常感谢您,此解决方案适合我!不客气:)