首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP转MySql转CSV转Excel UTF-8

PHP转MySql转CSV转Excel UTF-8
EN

Stack Overflow用户
提问于 2013-01-29 00:57:49
回答 2查看 6.5K关注 0票数 3

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

现在我尝试的是:

PHP:

代码语言:javascript
复制
header("Content-Type: text/html; charset=utf-8");
$mysqli->set_charset("utf8");

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

代码语言:javascript
复制
create database db CHARACTER SET utf8 COLLATE utf8_general_ci;
create table ...

我更改了我的my.cnf并重启了我的sql server:

代码语言:javascript
复制
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci

[mysql]
default-character-set=utf8

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

代码语言:javascript
复制
| 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/ |

php测试:

代码语言:javascript
复制
var_dump($mysqli->get_charset());

给我:

代码语言:javascript
复制
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" }

现在我使用:

代码语言:javascript
复制
mysql -uroot -ppw db < require.sql > /tmp/test.csv

require.sql仅仅是一个

代码语言:javascript
复制
select * from table;

同样,无论我选择UTF-8还是其他格式,我都无法将其作为csv导入到Excel中。它总是给我一些密码..

希望有人知道这里可能出了什么问题..

干杯

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

E2:我也尝试了用latin1做同样的事情--同样的问题,在不破坏特殊字符的情况下,无法将特殊字符导入excel。有任何提示或解决方法吗?

E3:我发现了一种解决方法,可以使用Excel导入功能,但不能双击.csv。

代码语言:javascript
复制
    iconv -f utf8 -t ISO-8859-1 test.csv > test_ISO.csv

现在,我可以使用Windows(ANSI)将csv导入到excel中。不得不使用这个功能而不是双击,这仍然很烦人。此外,我真的不明白为什么UTF8不能工作,即使是导入功能,添加了物料清单和UTF8中的完整数据库。

逗号分隔也变得一团糟。1. Concat_WS只能部分工作,因为它添加了一个愚蠢的concat_ws(..).csv文件的头文件。此外,“文件test.csv”没有给我一个“逗号分隔”。这意味着即使所有内容都用逗号分隔,Excel在双击时也不会注意到它。2. sed/awk:找到了一些代码片段,但所有这些代码片段对表的分隔都非常糟糕。例如,colum street "streetname number“仍然是一个”streetname“,”number“把一列变成了两列,桌子就完蛋了。

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

代码语言:javascript
复制
file test1.csv

将会是

代码语言:javascript
复制
test1.csv: ISO-8859 text, with CRLF line terminators

而使用RegEx添加逗号的图标更改后的字符集将如下所示:

代码语言:javascript
复制
test1.csv: ISO-8859 text

非常奇怪的行为--也许有人找到了一个有效的解决方案。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-05 20:34:09

感谢大家的帮助,我终于设法得到了一个工作-双击csv文件,它可以单独打开并正确显示信件。对于那些对好的工作流感兴趣的人,我们来看看:

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

代码语言:javascript
复制
header("Content-Type: text/html; charset=ISO-8859");

我知道这会让数据库中的所有东西看起来都很糟糕,尽管你可以使用utf8让它看起来正确,但这对我来说无关紧要。

3.)我编写了一个由cron守护进程执行的脚本,该脚本a)删除先前创建的.csv文件

代码语言:javascript
复制
rm -f path/to/csv ##I have 3 due to some renaming see below

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

代码语言:javascript
复制
mysql -hSERVERIP -uUSER -pPASS DBNAME -e "select * from DBTABLE;" > PATH/TO/output.csv

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

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

代码语言:javascript
复制
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文件中的脚本:

代码语言:javascript
复制
/usr/bin/python PATH/TO/semicolon.py < output.csv > output_semi.csv

如果您将脚本用作cron,请确保使用每个文件的完整路径。

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

代码语言:javascript
复制
iconv -f utf8 -t ISO-8859-1 output_semi.csv > output_final.csv

就是这样。双击Mac/Windows Excel 2010 (已测试)即可打开csv。

也许这对有类似问题的人是有帮助的。我都快疯了。

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

代码语言:javascript
复制
file output.csv

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

票数 0
EN

Stack Overflow用户

发布于 2013-01-29 21:43:54

这就是我如何保存从utf-8 mysql表中获取的数据。您需要先添加BOM。示例:

代码语言:javascript
复制
<?php
$fp = fopen(dirname(__FILE__).'/'.$filename, 'wb'); 
fputs($fp, "\xEF\xBB\xBF"); 
fputcsv($fp, array($utfstr_1,$utfstr_2);
fclose($fp);

确保您还告诉MySQL您将使用UTF-8

代码语言:javascript
复制
mysql_query("SET CHARACTER SET utf8"); 
mysql_query("SET NAMES utf8"); 

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

如果您设置了语言环境,Propaply将不会很差:setlocale(LC_ALL, "en_US.UTF-8");

希望能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14567121

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档