近来在使用php/postgre开发应用时,其中有个功能是把CSV中的数据登录到数据库中
postgre的编码设定为UTF-8,而且php的配置文件中编码中也设定了default_charset = "UTF-8"
CSV文件用UTF-8打开是正常的。
但在登录过程中总会有这样的错误出现,错误信息其中部分如下:
ERROR: invalid UTF-8 byte sequence detected near byte 0xa0
...
这让我很迷惑,因为只是少数数据都发生这种错误,大部分还是正常登录进去的。
更令人郁闷的是这些数据组成的sql执行就没问题,
而且把这些出错的数据单独拷贝出来,保存后的文件再登录也没问题。
所以就怀疑文件的编码问题,但是用mb_detect_encoding函数诊断出来的结果都是UTF-8。
我也在网上逛了几圈,发现有这样的错误信息,但始终没有找到解决办法。
尝试了几番后,竟发现一种看似垃圾代码经起了作用,如下所示:
$fp = fopen($filename,'r');
$savefp = fopen($objfilename, 'w');
while(!feof($fp){
$src = fgets($fp, 500);
$str = mb_convert_encoding($str, "UTF-8", "UTF-8");
fwrite($savefp, $str);
}
fclose($savefp);
fclose($fp);
如上代码产生的新CSV文件登录就没问题了,
虽然问题没了,我却没有明白,这其中文件里值经mb_convert_encoding($str, "UTF-8", "UTF-8")
转换后,变化了什么?
那位高人明晓的话,可否告知一二。