如何在PHP中将非UTF-8编码转换为更易读的/ UTF-8编码?

3

我正在一个Laravel 5.4项目中使用“PDF解析器”来获取pdf文件的内容。但是,当我打印出内容时,我得到了一些编码文本,当鼠标悬停在上面时,会显示“5868个二进制或非UTF-8字符”。

这是应该读取文件内容的代码。

$file = $request->file('file');
$parser = new \Smalot\PdfParser\Parser();
$pdf    = $parser->parseFile($file);
$scannedText = $pdf->getText();
dd($scannedText);

它会输出类似这样的内容:

x00i\x00n\x00g\x00ª\x00t\x00h\x00i

PHP的mb_detect_encoding()函数在"编码类型"设置为"auto"时会返回false。utf8_encode()也不起作用,所以我知道它不是ISO-8859-1编码。
这就是我现在卡住的地方。任何帮助都将不胜感激。

2
将原始字节输入十六进制/文本编辑器,并选择不同的编码方式来解释内容,直到找到一个使文本正确显示的编码方式。如果每个字节都是“00”,则可能是UTF-16编码的文本。 - deceze
这有点棘手。在您不知道原编码是什么之前,您无法转换编码。我建议您尝试从原始PDF文件本身中提取编码信息。可能您正在使用的抽象库“Smalot\PdfParser\Parser”可以提供此信息?如果没有,您需要寻找其他PDF解析解决方案。这是一个有趣的问题 - 请务必随时向我们更新您最终的解决方案! :) - kieranpotts
谢谢你们的快速回应。 @kieranpotts 我检查了PDF文件,字体是Identity-H编码。当我使用Laravel内置的文件系统来检索内容(而不是PdfParser软件包),然后转储内容时,会显示一些无法阅读的文本,但编码似乎不同了。所以我继续使用mb_detect_encoding,结果得到'UTF-8'。这次,我认为问题在于试图转储文件内容。如果我错了,请指正我。 - Karan Singh
1
@deceze 这是一个不错的想法。但我正在寻找一个更简单、可编程的解决方案。谢谢你...非常感谢。 - Karan Singh
1个回答

1
在我的项目中,我遇到了类似于“PDF解析器”的错误。
但是使用https://github.com/spatie/pdf-to-text后,我不再遇到这个错误了。
你可以使用composer来安装它:
composer require spatie/pdf-to-text

它的工作方式如下:

use Spatie\PdfToText\Pdf;

$pdf = (new Pdf())->setPdf('sample.pdf');

$pdf->setOptions(['layout']);

dump($pdf->text());

我大约一年前在这个项目上工作,记得在PDF解析器上挣扎了一段时间后,我转向使用PdfToText,它非常好用。不过忘记在这里发布了。无论如何,感谢您的回复。干杯! - Karan Singh

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