我需要从编码为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的无效字节序列”。
该文件包含复杂数据,包括日期字段,数字字段和带有特殊字符和重音符号的多行文本字段,所有行都包含所有字段,即使为空。
答案 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);