使用 PHP fgetcsv() 函数管理数据时出现错误 "Undefined offset" 和 "invalid byte sequence for encoding UTF8"

Errors "Undefined offset" and "invalid byte sequence for encoding UTF8" while managing data with PHP fgetcsv() function

我需要从编码为 ISO-8859-1 的 .csv 文件中读取一些数据并将其内容放入编码为 UTF-8 的 PostgreSQL 数据库中,我收到两个错误,具体取决于行我正在处理的文件。

我正在使用 fgetcsv() 函数从文件中获取数据:

while (($line = fgetcsv($handle,0,';','"')) !== false) {

错误是 "Undefined offset" 在我调用这样的函数的行上:

$foo = my_function($file_line[$index]);

当我尝试将数据插入我的 PostgreSQL table 时发生错误 "invalid byte sequence for encoding UTF8"。

该文件包含复杂的数据,包括日期字段、数字字段和带有特殊字符和重音的多行文本字段,即使为空,所有行都有所有字段。

错误 "undefined offset" 的发生是因为数组没有通知索引。但它应该有(所有文件行都有所有字段)。

真正的问题出在 fgetcsv 函数中,我没有设置 "escape character" 并且文本中的字段末尾有一个斜杠(默认转义字符),这使得fgetcsv 函数不考虑定界符,弄乱了数组数据。

这已通过将不寻常的字符设置为 "escape chararcter" 解决,如下所示:

while (($line = fgetcsv($handle,0,';','"','')) !== false) {

"invalid byte sequence for encoding UTF8" 错误已通过从数据中删除所有非常规字符然后使用以下命令转换为 UTF-8 解决:

$field_content = preg_replace('/[^\x{0020}-\x{007E}\x{00c0}-\x{00fd}\x{000a}\x{0009}]/', '',$field_content); 
$field_content = utf8_encode($field_content);