我正在从来自excel的CSV文件导入数据,但我似乎无法正确插入数据。这个数据包含法语重音字符,如果我用OpenOffice打开CSV(我不使用excel),我只选择UTF-8,数据转换后显示正常。
如果我尝试将其读入php内存,我可以看到它们是UTF-8编码的字符串,如果我使用MB_DETECT_ENCODING。我连接到数据库并使用以下命令指定所有UTF-8字符集:
mysql_query('SET character_set_results = "utf8", character_set_client = "utf8", character_set_connection = "utf8", character_set_database = "utf8", character_set_server = "utf8"');
我可以证明我的数据库只包含UTF-8字段和表格。
我的内容会在第一个重音字符处被截断。但这似乎只发生在我的PHP脚本中。我将所有数据输出到浏览器,如果我复制INSERT语句,它会插入整个数据。
php和浏览器输出之间可能存在某些问题,但我可以证明它不在脚本的编程中......到目前为止,我能够通过HTMLENTITY来处理我的所有数据,但是问题是我的搜索引擎因为这个问题而变得疯狂......
任何可以保留的理由或方式都会非常感激......
编辑#1:
我搜索了CSV数据的默认Excel格式编码,发现它是CP1252。我尝试使用ICONV('CP1252','UTF-8 // TRANSLIT',$ data),现在,重音字符似乎很合适。我将在我的脚本中到处尝试,看看我的所有重音字符问题是否都已修复并发布解决方案,如果是这样的话......
答案 0 :(得分:1)
经过无数次的尝试,我能够解决所有编码问题,但其中一些我仍然不知道为什么会发生这些问题。我希望以后会给别人一些帮助:
function fixEncoding($data){
//Replace
return iconv('CP1252', 'UTF-8//TRANSLIT', $data);
}
我现在用这个函数正确地重新编码我的字符串。似乎excel将数据保存为CP1252而不是utf-8。
此外,如果你使用fgetcsv,似乎在CSV中的字符串开头有重音字符的错误,所以我不得不放弃使用fgetcsv并创建一个替代方法,因为我不在PHP 5.3中,也许str_getcsv可以解决我的问题,我不确定,但在目前的情况下,它不能导致我没有该功能。我甚至尝试寻找端口,似乎没有任何东西存在并正常工作。
这是我的解决方案,虽然非常难看,但它对我有用:
function fgetcsv2($filepointer, $maxlen, $sep, $enc){
$data = fgets($filepointer, $maxlen);
if($data === false){
return false;
}
$data = explode($sep, $data);
return $data;
}
祝所有遇到类似问题的人好运
答案 1 :(得分:1)
答案 2 :(得分:1)
我刚刚遇到了类似的问题,虽然我使用MB_DETECT_ENCODING测试了$ value并且它说它是UTF-8,但它仍然截断了数据。
不知道要转换什么,我无法使用上面提到的iconv功能。
但是我使用utf8_encode($ value)将它强制为UTF-8,现在一切正常。
答案 3 :(得分:0)
您使用的是哪种编码?
MB_DETECT_ENCODING始终不是100%正确,并且没有编码检测器。