PHP:使用utf8_encode时在csv中错误编码的字符

时间:2016-06-23 14:31:57

标签: php mysql csv

从MySql数据库中提取数据并将其插入CSV文件时,我遇到了一个奇怪的问题。在数据库中,字段值如下:

K Secure Connection 1 año 1 PC

当我echo将它写入CSV文件之前,我在终端中获得与上面相同的内容。

我使用以下代码将内容写入CSV文件:

fwrite($this->fileHandle, utf8_encode($lineContent . PHP_EOL));

然而,当我使用LibreOffice Calc打开CSV(并指定UTF-8作为编码格式)时,会显示以下内容:

K Secure Connection 1 año 1 PC

我不知道为什么会这样。有人可以解释如何解决这个问题吗?

REM:

SELECT @@character_set_database;

返回

latin1 

REM 2:

`var_dump($lineContent, bin2hex($lineContent))`

给出

string(39) "Kaspersky Secure Connection 1 año 1 PC"
string(78) "4b6173706572736b792053656375726520436f6e6e656374696f6e20312061c3b16f2031205043"

2 个答案:

答案 0 :(得分:3)

var_dump表示该字符串已经以UTF-8编码。在它上面使用utf8_encode会使它变得混乱(该函数尝试将转换从Latin-1转换为UTF-8)。因此,你实际上是用UTF-8编写的“año”编码到你的文件中,然后由LibreOffice“正确”选取。

根本不要utf8_encode

答案 1 :(得分:0)

我会尝试用其他编辑器打开csv文件,以确保问题不在办公室......

如果内容已经是UTF-8格式,您可能会对内容进行双重编码。

我也更喜欢使用UTF-8,因此我从UTF-8中获取了数据库中的数据,不再需要转换。为此,我在打开SQL连接后立即运行此查询:

"set names 'utf8'"