A:数据源文件格式为CSC UTF-8(逗号分隔)(*.csv)时,使用ftcsv()模式进行导入后,结果中的中文出现乱码现象。
原因是:天软客户端为gbk编码,用户通过以前的ftcsv()模式导入UTF8 bom格式后,中间数据处理没有进行转换,导致乱码现象。
解决办法:
1、
目前最新的客户端版本(2023-12-04日更新)已支持ftcsv()模式下处理uft8 bom格式,解决了乱码的问题,用户可选择升级客户端到最新版本后使用。(此方式为主推模式)
相关升级说明:FAQ:
2023-12-4客户端升级说明:ftcsv模式支持utf8 bom格式csv
升级客户端到2023-12-04日版本,关于乱码现象的前后对比:
测试代码:
LJ:="C:\\Test\\File\\2023-12\\20231204.csv";
rdo2 importfile(ftcsv(),"",LJ,t);
return t;
源文件在保存时,保存类型为UTF-8格式,如下所示
升级前导入结果:
升级后导入结果:解决乱码问题
2、若不想升级客户端,则用户可封装相关模型对编码进行转码处理,例如下:
封装模型ImportCSV(ft,path,data)替代importfile,加一层对csv编码的判断与处理,实现如下:
(注:该deom只实现了importfile的基础功能,用户若还要更多导入的功能,可在此基础上进行增加实现,下列代码供用户参考)
Function ImportCSV(ft,path,data);
begin
size:=filesize("",path);
Ret:=readfile(rwBinary(),'',path,0,size,data);
//判断是否utf-8 bom头,转成ANSI格式的CSV文件,
if ft=ftcsv() and (length(data)>3) and (ord(data[0])=0xef) and (ord(data[1])=0xbb) and (ord(data[2])=0xbf) then
begin
try
s:=UTF8ToAnsi(data[3:]);
sArr:=str2array(s,"\r\n");
r:=array();
for i:=0 to length(sArr)-1 do
begin
if trim(sArr[i])<>'' then
r[i]:=str2array(sArr[i],",");
end
rc:=r[0];//--默认第一行为列标
r:=r[1:];
reindex(r,nil,rc);
data:=r;
except
return ExceptObject.ErrInfo;
end;
end
else ret:=importfile(ft,"",path,data);
return ret;
end
执行导入操作:
LJ:="C:\\Test\\File\\2023-12\\20231204.csv";
r:= rdo2 ImportCSV(ftcsv(),LJ,data);
echo r;
return t;
导入结果:
