我尝试通过 PHP 解析一个 csv 文件SplFileObject
。可悲的是SplFileObject
,如果文本中有错误的不可见字符,有时会卡住。该函数在遍历 csv 文件中的行时检测引用而不是跳过或读取它作为普通字符。下面的截图来自 Textwrangler:
我还在这里从 Textwrangler 复制了它(不可见的字符应该在“forgé”和“Circa”之间):
Fer forgé.� Circa
我的代码(SplFileObject 部分):
$splFile = new \SplFileObject($file);
$splFile->setFlags(\SplFileObject::DROP_NEW_LINE | \SplFileObject::SKIP_EMPTY | \SplFileObject::READ_AHEAD | \SplFileObject::READ_CSV);
$splFile->setCsvControl(",", '"', '"');
我试图找出 csv 文件通过file -I my.csv
. 输出:my.csv: application/octet-stream; charset=binary
。这是一个奇怪的结果,因为该文件可以通过 Textwrangler 读取,因此不是二进制文件。我还阅读了以相同方式生成的另一个 csv,并且输出与预期的一样:second.csv: text/plain; charset=utf-8
. 用于生成 csv 文件的工具称为Visual Web Ripper(用于抓取网页的工具)。
我如何确定这个倒置问号是哪个字符(它似乎不是西班牙语倒置问号 - 可能只是 Textwrangler 插入的占位符)?如何删除我的 csv 文件中的这个字符和所有“无效”字符?是否有一个正则表达式匹配每个字符、数字、符号(标点符号和其他文本符号),实际上是一个真正的字符并省略了上面示例中的内容?我正在寻找一个 unicode 安全的正则表达式(需要保留德语变音符号、法语、俄语、中文、日语和韩语字符)。或者:如何将 csv 文件转换charset=binary
为UTF-8?
编辑:
如果我通过nano
编辑器打开它,它会显示forgé.^@ Circa
. 快速搜索后,它似乎是一个 NUL 字符或 \u0000(请参阅评论和https://en.wikipedia.org/wiki/Null_character以供参考)。
编辑 2:
我对其进行了深入研究:该函数似乎存在问题,该$splFile->current()
函数在当前文件指针处读取一行。该行在NUL
字符之后被截断(无论我尝试通过SplFileObject::READ_CSV
还是普通字符串(不带SplFileObject::READ_CSV
参数)读取它)。