如何解码 LTTextLine.get_text() 的输出?

How to decode output of LTTextLine.get_text()?

我是 PDFminer 新手。我注意到在使用 PDFminer get_text() 命令时,一些 symbols/punctuations 没有以文字形式输出。例如,“-”输出为“\xe2\x80\x93”,单引号 ' 输出为“\xe2\x80\x99”。这是我使用的命令:

打印(LTTextLine.get_text().编码('UTF-8'))

谁能帮我理解如何阅读这些内容,并将其转换回文字形式?

谢谢。

您不喜欢的十六进制转义不是连字符 (ASCII 39) 和单引号 (ASCII 45)。它们是印刷连字符 (a.k.a.en-dashes) (Unicode 2010) 和右单引号(“智能”)引号 (Unicode 2019)。它们被编码为 UTF-8。如果要解码它们,请将包含它们的字符串视为字节,而不是字符串(注意 b 前缀):

>>> mystring = b"This is an en\xe2\x80\x93dash and this - isn\xe2\x80\x99t"
>>> mystring.decode('UTF8')
'This is an en–dash and this - isn’t'

如果Python认为数据已经是一个字符串,如下所示,没有b前缀,那么你需要说服它它真的是字节,并解码结果:

>>> mystring = "This is an en\xe2\x80\x93dash and this - isn\xe2\x80\x99t"
>>> bytes(mystring.encode("latin-1")).decode("UTF-8")
'This is an en–dash and this - isn’t'

在 SO 使用的字体中,ASCII 39 和 Unicode 2010 之间没有太大区别,但通常印刷连字符比 ASCII 连字符更短、更粗并且更接近基线。其他两者之间的区别在 isn’t'。在 .pdf 文件中找到 Unicode 变体是很常见的,因为它们是用来打印的。 ASCII 变体实际上只适用于程序代码和旧打字机的仿真;不是印刷书籍和杂志。