PHP到MySql到CSV到Excel UTF-8

我知道这已经讨论过好几次了,但是我正在处理这个问题。 我有一个submit.php操作的表单。 起初,我并没有改变任何关于字符集的东西,我没有使用任何utf8头信息。结果是我可以正确地读取数据库中的所有ä,ö,ü等。 现在将它们导出为.csv ,并以UTF-8 charset将它们导入到Excel(也testing了其他所有UTF-8 charset ),结果产生不正确的字符集。

现在我试过了:

PHP:

 header("Content-Type: text/html; charset=utf-8"); $mysqli->set_charset("utf8"); 

MySQL:我删除了我的数据库,并创build一个新的:

 create database db CHARACTER SET utf8 COLLATE utf8_general_ci; create table ... 

我改变了my.cnf并重新启动了我的sql服务器:

 [mysqld] character-set-server=utf8 collation-server=utf8_general_ci [mysql] default-character-set=utf8 

如果我通过bash连接到我的数据库,我收到以下输出:

 | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | utf8 | | character_set_system | utf8 | | character_sets_dir | /usr/local/mysql/share/charsets/ | 

一个phptesting:

 var_dump($mysqli->get_charset()); 

给我:

 Current character set: utf8 object(stdClass)#3 (8) { ["charset"]=> string(4) "utf8" ["collation"]=> string(15) "utf8_general_ci" ["dir"]=> string(0) "" ["min_length"]=> int(1) ["max_length"]=> int(3) ["number"]=> int(33) ["state"]=> int(1) ["comment"]=> string(13) "UTF-8 Unicode" } 

现在我用:

 mysql -uroot -ppw db < require.sql > /tmp/test.csv 

require.sql只是一个

 select * from table; 

而且,无论我selectUTF-8还是其他任何东西,我都无法将其作为csv导入到Excel中。 总是给我一些密码

希望有人得到一个暗示可能在这里出了什么问题..

干杯

E:TextMate给我一个正确的输出,所以看起来转换实际上工作,这是和Excel的问题? 使用Microsoft Office 2011。

E2:也尝试了latin1的相同的东西 – 同样的问题,不能将特殊字符导入到Excel中,而不会破坏它们。 任何提示或解决方法?

E3:我发现了一个与Excel导入function一起工作的解决方法,但是没有双击.csv。

  iconv -f utf8 -t ISO-8859-1 test.csv > test_ISO.csv 

现在我可以使用Windows(ANSI)将csv导入到excel中。 仍然很烦,不得不使用这个function,而不是双击。 另外我真的不明白为什么UTF8不工作,甚至没有导入function,添加BOM和UTF8中的完整数据库。

逗号分隔结果也是一团糟。 1. Concat_WS只能部分工作,因为它将一个愚蠢的concat_ws(..)头添加到.csv文件。 另外“文件test.csv”不给我一个“逗号分隔”。 这意味着即使所有的东西都被逗号隔开,Excel也不会使用双击来注意到它。 2. sed / awk:find了一些代码片段,但是他们都把表格分离得非常糟糕。 例如,colum street“streetname number”仍然是一个“街道名”,“数字”,这个数字使得2个colums从一个表中旋转。

所以在我看来,Excel只能双击打开.csv。a)使用ISO-8859-1进行编码(因为标准mac字符集是Macintosh,所以只能在windows下进行编码)b)具有“逗号分隔”属性的文件。 这意味着如果我通过Excel自己创build.csv的输出

 file test1.csv 

将会

 test1.csv: ISO-8859 text, with CRLF line terminators 

而iconv改变字符集与RegEx用于添加逗号将如下所示:

 test1.csv: ISO-8859 text 

很奇怪的行为 – 也许有人得到了一个工作的解决scheme。

这就是我保存从utf-8 mysql表中获取的数据的方法。 您需要先添加物料清单。 例:

 <?php $fp = fopen(dirname(__FILE__).'/'.$filename, 'wb'); fputs($fp, "\xEF\xBB\xBF"); fputcsv($fp, array($utfstr_1,$utfstr_2); fclose($fp); 

确保你也告诉MySQL你将使用UTF-8

 mysql_query("SET CHARACTER SET utf8"); mysql_query("SET NAMES utf8"); 

您需要在select任何数据之前执行此操作。

如果你设置locale,propaply不会太坏: setlocale(LC_ALL, "en_US.UTF-8");

希望能帮助到你。

感谢大家的帮助,我终于设法得到一个工作 – 双击csv文件打开分开,正确显示字母。 对于那些有兴趣在这里有一个好的工作stream程,我们去:

1)我的数据库完全使用UTF8。 2.)我通过php将表单导出到我的数据库中。 我使用mysqli和头信息:

 header("Content-Type: text/html; charset=ISO-8859"); 

我知道这使得数据库里的所有东西看起来都很糟糕,可以随意使用utf8来使它看起来正确,但是对我而言并不重要。

3.)我写了一个由cron守护进程执行的脚本,其中a)删除之前创build的.csv文件

 rm -f path/to/csv ##I have 3 due to some renaming see below 

b)使用mysql创build新的csv(这仍然是UTF8)

 mysql -hSERVERIP -uUSER -pPASS DBNAME -e "select * from DBTABLE;" > PATH/TO/output.csv 

现在你有一个分隔符.csv和(如果你从PHP以UTF8导出),它将在OpenOffice等,但不是在Excel中正确显示。 即使是UTF8导入也不起作用。

c)使文件SEMICOLON分开(Excel标准,双击一个逗号分隔的文件将不起作用,至less不与欧洲版本的Excel)。 我用了一个小的python脚本semicolon.py:

 import sys import csv tabin = csv.reader(sys.stdin, dialect=csv.excel_tab) commaout = csv.writer(sys.stdout, delimiter=";") for row in tabin: commaout.writerow(row) 

d)现在我不得不在我的cron sh文件中调用脚本:

 /usr/bin/python PATH/TO/semicolon.py < output.csv > output_semi.csv 

确保你使用每个文件的完整path,如果你使用脚本作为cron。

e)使用iconv将字符集从UTF8更改为ISO-8859-1(Windows ANSI Excel标准):

 iconv -f utf8 -t ISO-8859-1 output_semi.csv > output_final.csv 

就是这样。 双击Mac / Windows Excel 2010(已testing),csv打开。

也许这是对有类似问题的人的帮助。 这让我疯狂。

编辑:对于一些服务器,你不需要iconv,因为数据库的输出已经是ISO8859。 执行mysql命令后,你应该检查你的csv:

 file output.csv 

仅当字符集不是iso8859-1时才使用iconv