在Python中将二进制转换为UTF-8

11

我有一个二进制代码如下:

1101100110000110110110011000001011011000101001111101100010101000

我想将其转换为UTF-8编码。在Python中该怎么做?


这个二进制字符串是用什么编码的?ASCII吗?还是你的意思是这些字节是一个UTF-8编码的字符串,你想在Python中得到一个Unicode字符串? - Claudiu
“将其转换为UTF-8”是什么意思?从二进制八位组创建字符? - Paulo Bu
1
二进制字符串采用utf-8编码,是的,我想在Python中获取Unicode字符串。 - Aidin.T
我认为我们没有准确理解你拥有的文件类型。你能否运行 hdod 或类似的十六进制转储实用程序,并复制粘贴前几行? - Robᵩ
这不是一个文件。我只有一段波斯语的文本,将其转换为二进制,现在我想将其转换回文本。 - Aidin.T
显示剩余2条评论
4个回答

18

简化版:

>>> test_string = '1101100110000110110110011000001011011000101001111101100010101000'
>>> print ('%x' % int(test_string, 2)).decode('hex').decode('utf-8')
نقاب

倒数(来自@Robᵩ的评论):

>>> '{:b}'.format(int(u'نقاب'.encode('utf-8').encode('hex'), 16))
1: '1101100110000110110110011000001011011000101001111101100010101000'

但它不能正常工作。它显示了其他内容,而不是我刚刚转换为二进制的第一段文本。 - Aidin.T
工作了,谢谢。我认为我应该将检查移到这个答案。这样会更简单。 - Aidin.T
2
反之亦然:s=u'نقاب'; print '{:b}'.format(int(s.encode('utf-8').encode('hex'), 16)) - Robᵩ
@Robᵩ 对答案进行了小修改(我认为在这种情况下,.encode('utf-8')是不必要的)。 - Igonato
1
请注意,s = "سلام"s = u"سلام"会产生不同的结果。前者失败了,后者成功了。但是让我们停止解决新问题。@Aidin.T,如果您在编码方面有问题,请开一个新问题。 - Robᵩ
显示剩余10条评论

4

我的想法是: 1. 将字符串分成八位一组 2. 使用 int 和后来的 chr 将八位数转换为十六进制 3. 将它们连接起来并将 utf-8 字符串解码为 Unicode

这段代码对我有用,但我不确定它打印出来的是什么,因为我的控制台没有 utf-8(Windows :P)。

s = '1101100110000110110110011000001011011000101001111101100010101000'
u = "".join([chr(int(x,2)) for x in [s[i:i+8] 
                           for i in range(0,len(s), 8)
                           ]
            ])
d = u.decode('utf-8')

希望这可以帮助你!

3
我对unichr有些怀疑。因为原帖中说他的二进制已经是UTF-8格式了。UTF-8有可变长度的字符,所以我只使用了chr函数将原始字节串拼接成一个字符串,然后再将其解码为Unicode。 - Paulo Bu
2
@JoranBeasley - 我不同意,假设使用的是Python2。在那一步中,他正在收集字节而不是字符。只有在获得utf-8编码的字节字符串后,他才想要进行转换。 - Robᵩ
@Robᵩ:这就是我的观点。很好的答案,喜欢split('........')。我认为基本上和我的想法一样。+1 - Paulo Bu
1
+1 - 这是和我的技巧一样的(所以我显然赞同),而且你解释得更清楚。提问者应该把勾选移到这个更好的答案上。 - Robᵩ

3
>>> s='1101100110000110110110011000001011011000101001111101100010101000'
>>> print (''.join([chr(int(x,2)) for x in re.split('(........)', s) if x ])).decode('utf-8')
نقاب
>>> 

或者,反之亦然:

>>> s=u'نقاب'
>>> ''.join(['{:b}'.format(ord(x)) for x in s.encode('utf-8')])
'1101100110000110110110011000001011011000101001111101100010101000'
>>> 

还有一个问题,我如何通过Python将我的文本转换为二进制?我的意思是反向形式的问题。 - Aidin.T

1
使用:
def bin2text(s): return "".join([chr(int(s[i:i+8],2)) for i in xrange(0,len(s),8)])


>>> print bin2text("01110100011001010111001101110100")
>>> test

1
如何在程序中正确显示我的文本?它返回了'\xd9\x86\xd9\x82\xd8\xa7\xd8\xa8',该怎么改正? - Aidin.T
2
你需要使用unichr()而不是仅仅使用chr()。http://docs.python.org/2/library/functions.html#unichr - Christian Ternus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接