【问题标题】:converting binary to utf-8 in python在python中将二进制转换为utf-8
【发布时间】:2013-10-15 20:32:31
【问题描述】:

我有一个这样的二进制文件: 1101100110000110110110011000001011011000101001111101100010101000

我想将其转换为 utf-8。 我如何在 python 中做到这一点?

【问题讨论】:

  • 二进制字符串采用什么编码方式? ASCII?或者你的意思是字节是一个 utf-8 编码的字符串,你想在 python 中得到一个 unicode 字符串?
  • “将其转换为 utf-8”是什么意思?从二进制八位字节创建字符?
  • 二进制字符串在 utf-8 中,是的,我想在 python 中获取一个 unicode 字符串。
  • 我认为我们没有准确了解您拥有的文件类型。您能否运行hdod 或类似的十六进制转储实用程序并复制粘贴前几行?
  • 它不是一个文件。我只有一个波斯语文本,我将其转换为二进制,现在我想将其转换回文本。

标签: python string utf-8 binary converter


【解决方案1】:

更干净的版本:

>>> 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'

【讨论】:

  • 但它不能正常工作。它显示了其他内容,而不是我刚刚转换为二进制的第一个文本
  • 工作,谢谢。我想我应该把支票移到这个答案上。真的很简单
  • 反之亦然:s=u'نقاب'; print '{:b}'.format(int(s.encode('utf-8').encode('hex'), 16))
  • @Robᵩ 在答案中添加了少量编辑(我认为在这种情况下 .encode('utf-8') 是不必要的)。
  • 请注意 s = "سلام"s = u"سلام" 给出不同的结果。前者失败,后者有效。但是,让我们停止解决新问题。 @Aidin.T,如果您对编码有疑问,请打开一个新问题。
【解决方案2】:

嗯,我的想法是: 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')

希望这会有所帮助!

【讨论】:

  • 嗯,我有点怀疑unichr。因为 OP 说他的二进制文件已经是 utf-8。 utf-8 具有可变字符长度,所以我只是使用 chr 将原始字节加入字符串中,然后将它们解码为 Unicode。
  • @JoranBeasley - 我不同意,假设是 Python2。在这一步中,他收集的是字节,而不是字符。只有在他有了 utf-8 编码的字节串之后,他才想转换。
  • @Robᵩ:这就是我的观点。很好的答案,喜欢split('........')。我觉得和我的想法基本一样。 +1
  • +1 - 这与我的技术相同(显然我赞成),而且你解释了你的。提问者应该将检查移至这个更好的答案。
【解决方案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将我的文本转换为二进制?我的意思是我的问题的反形式
【解决方案4】:

用途:

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


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

【讨论】:

猜你喜欢
  • 2015-05-27
  • 1970-01-01
  • 2016-07-16
  • 2015-11-30
  • 1970-01-01
  • 2022-11-03
  • 1970-01-01
  • 2017-07-21
  • 2014-11-07
相关资源
最近更新 更多