Mysql插入由奇怪的字符编码截断的文本数据

时间:2011-11-13 16:16:57

标签: php mysql character-encoding

我正在从来自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),现在,重音字符似乎很合适。我将在我的脚本中到处尝试,看看我的所有重音字符问题是否都已修复并发布解决方案,如果是这样的话......

4 个答案:

答案 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)

我还必须参与这样一个项目,而且,严肃地说,PHPExcel是我避免任何脑力劳动的救星。

P.S。 :另外,this link可帮助您入门(法语)。

答案 2 :(得分:1)

我刚刚遇到了类似的问题,虽然我使用MB_DETECT_ENCODING测试了$ value并且它说它是UTF-8,但它仍然截断了数据。

不知道要转换什么,我无法使用上面提到的iconv功能。

但是我使用utf8_encode($ value)将它强制为UTF-8,现在一切正常。

答案 3 :(得分:0)

您使用的是哪种编码?

MB_DETECT_ENCODING始终不是100%正确,并且没有编码检测器。