我知道这个问题已经讨论了好几次了,但我还是要疯狂地处理这个问题。我有一个带有submit.php操作的表单。起初,我没有更改任何有关字符集的内容,也没有使用任何utf8头信息。结果是我可以正确地读取数据库中的所有ä、ö、ü等。现在,将它们导出到.csv并作为UTF-8 charset导入到Excel (也测试了所有其他的)会导致不正确的字符集。
现在我尝试的是:
PHP:
header("Content-Type: text/html; charset=utf-8");
$mysqli->set_charset("utf8");MySQL:我删除了我的数据库,并创建了一个新的:
create database db CHARACTER SET utf8 COLLATE utf8_general_ci;
create table ...我更改了我的my.cnf并重启了我的sql server:
[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/ |php测试:
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.csvrequire.sql仅仅是一个
select * from table;同样,无论我选择UTF-8还是其他格式,我都无法将其作为csv导入到Excel中。它总是给我一些密码..
希望有人知道这里可能出了什么问题..
干杯
E: TextMate给了我一个正确的输出,所以看起来转换确实起作用了,这是不是和Excel的问题?使用Microsoft Office 2011。
E2:我也尝试了用latin1做同样的事情--同样的问题,在不破坏特殊字符的情况下,无法将特殊字符导入excel。有任何提示或解决方法吗?
E3:我发现了一种解决方法,可以使用Excel导入功能,但不能双击.csv。
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,输出
file test1.csv将会是
test1.csv: ISO-8859 text, with CRLF line terminators而使用RegEx添加逗号的图标更改后的字符集将如下所示:
test1.csv: ISO-8859 text非常奇怪的行为--也许有人找到了一个有效的解决方案。
发布于 2013-02-05 20:34:09
感谢大家的帮助,我终于设法得到了一个工作-双击csv文件,它可以单独打开并正确显示信件。对于那些对好的工作流感兴趣的人,我们来看看:
1.)我的数据库完全使用UTF8。2.)我通过php将表单导出到我的数据库中。我使用mysqli和作为头信息:
header("Content-Type: text/html; charset=ISO-8859");我知道这会让数据库中的所有东西看起来都很糟糕,尽管你可以使用utf8让它看起来正确,但这对我来说无关紧要。
3.)我编写了一个由cron守护进程执行的脚本,该脚本a)删除先前创建的.csv文件
rm -f path/to/csv ##I have 3 due to some renaming see belowb)使用mysql创建新的csv (仍然是UTF8)
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:
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如果您将脚本用作cron,请确保使用每个文件的完整路径。
e)使用图标v将字符集从UTF8更改为ISO-8859-1 (Windows ANSI Excel标准):
iconv -f utf8 -t ISO-8859-1 output_semi.csv > output_final.csv就是这样。双击Mac/Windows Excel 2010 (已测试)即可打开csv。
也许这对有类似问题的人是有帮助的。我都快疯了。
编辑:对于某些服务器,您不需要iconv,因为数据库的输出已经是ISO8859。您应该在执行mysql命令后检查您的csv:
file output.csv仅当字符集不是iso8859-1时才使用iconv
发布于 2013-01-29 21:43:54
这就是我如何保存从utf-8 mysql表中获取的数据。您需要先添加BOM。示例:
<?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"); 在选择任何数据之前,您需要执行此操作。
如果您设置了语言环境,Propaply将不会很差:setlocale(LC_ALL, "en_US.UTF-8");
希望能有所帮助。
https://stackoverflow.com/questions/14567121
复制相似问题