使用PHP fgetcsv()函数管理数据时出现错误“Undefined offset”和“用于编码UTF8的无效字节序列”

时间:2017-12-08 17:29:57

标签: php postgresql encoding utf-8 fgetcsv

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

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

CREATE FUNCTION dbo.fn_char2hex(@char char(1))
RETURNS char(2)
AS BEGIN

    DECLARE @hex char(2), @dec int;
    SET @dec=ASCII(@char);
    SET @hex= --- First hex digit:
             SUBSTRING('0123456789ABCDEF', 1+(@dec-@dec%16)/16, 1)+
              --- Second hex digit:
             SUBSTRING('0123456789ABCDEF', 1+(     @dec%16)   , 1);
    RETURN(@hex);
END

CREATE FUNCTION dbo.fn_UrlEncode(@string varchar(max))
RETURNS varchar(max)
AS BEGIN
    DECLARE @offset int, @char char(1);
    SET @string = REPLACE(@string, '%', '%' + dbo.fn_Char2Hex('%'));
    SET @offset=PATINDEX('%[^A-Z0-9.\-\%]%', @string);
    WHILE (@offset!=0) BEGIN;
        SET @char = SUBSTRING(@string, @offset, 1);
        SET @string = REPLACE(@string, @char, '%' + dbo.fn_Char2hHx(@char));
        SET @offset = PATINDEX('%[^A-Z0-9.\-\%]%', @string);
    END
    RETURN @string;
END;

在我调用这样一个函数的行上,错误是“Undefined offset”:

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

当我尝试将数据插入到PostgreSQL表中时,出现错误“编码UTF8的无效字节序列”。

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

1 个答案:

答案 0 :(得分:0)

错误"未定义的偏移"是因为阵列没有通知索引。但它应该有(所有文件行都包含所有字段)。

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

这是通过将一个不寻常的角色设置为" escape chararcter"来解决的,如下所示:

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

"用于编码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);