将断开的字节字符串从unicode转换回相应的字节

时间:2018-03-05 12:02:54

标签: python python-2.7 python-unicode

以下代码检索rows中包含PDF字节流的字符串的可迭代对象。字符串row的类型为str。生成的文件是PDF格式,可以打开。

with open(fname, "wb") as fd:
    for row in rows:
        fd.write(row)

由于新的C-Library和Python实现中的更改,str更改为unicode。并且相应的内容也发生了变化,因此我的PDF文件被破坏了。

第一个row对象的起始字节:

old row[0]: 25 50 44 46 2D 31 2E 33  0D 0A 25 E2    E3    CF    D3    0D 0A ...
new row[0]: 25 50 44 46 2D 31 2E 33  0D 0A 25 C3 A2 C3 A3 C3 8F C3 93 0D 0A ...

我在这里调整相应的字节位置,看起来像是一个unicode问题。

我认为这是一个好的开始,但我仍然有一个unicode字符串作为输入......

>>> "\xc3\xa2".decode('utf8')  # but as input I have u"\xc3\xa2"
u'\xe2'

我已经尝试了几次encodedecode来电,所以我需要一种更加分析的方法来解决这个问题。我无法看到木头的树木。谢谢。

2 个答案:

答案 0 :(得分:0)

当您在Python unicode字符串中找到u"\xc3\xa2"时,通常意味着您已读取UTF-8编码文件,因为它是Latin1编码的。所以最好的办法当然是修复初始阅读。

如果你不得不依赖破坏的代码,那么修复仍然很简单:你只需将字符串编码为Latin1,然后将其解码为UTF-8:

fixed_u_str = broken_u_str.encode('Latin1').decode('UTF-8')

例如:

u"\xc3\xa2\xc3\xa3".encode('Latin1').decode('utf8')

正确显示u"\xe2\xe3",显示为âã

答案 1 :(得分:0)

这看起来像你应该做的

fd.write(row.encode('utf-8'))

假设row的类型现在是unicode(这是我对你如何呈现内容的理解)。