从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"
答案 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'"