【问题标题】:PHP to MySql to CSV to Excel UTF-8PHP 到 MySql 到 CSV 到 Excel UTF-8
【发布时间】:2013-01-28 16:57:48
【问题描述】:

我知道这个问题已经讨论过好几次了,但是我正在疯狂地处理这个问题。我有一个带有 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.csv

require.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 不起作用,即使是导入功能、添加的 BOM 和 UTF8 中的完整数据库也是如此。

逗号分隔也变得一团糟。 1. Concat_WS 仅部分起作用,因为它在 .csv 文件中添加了一个愚蠢的 concat_ws(..) 标头。 “文件 test.csv”也没有给我一个“逗号分隔”。这意味着即使所有内容都用逗号分隔,Excel 也不会在双击时注意到它。 2. sed/awk:找到了一些代码sn-ps,但是它们都把表格分隔得很糟糕。例如。 colum street "streetname number" 仍然是一个 'streetname','number' ,这使得 2 个列合二为一,表格被搞砸了。

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

的输出
file test1.csv

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

虽然 iconv 使用 RegEx 更改字符集用于添加逗号,但看起来像:

test1.csv: ISO-8859 text

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

【问题讨论】:

  • Excel 在编码方面臭名昭著!您是否在文本编辑器中打开了 CSV 文件以查看它是否真的是 UTF-8?如果正确,请使用 Excel 中的各种手动导入选项正确导入数据。否则 Excel 很可能是唯一的问题。
  • OpenOffice 也给了我正确的输出选择 UTF-8。在 Excel 中,我有很多选项可供选择。我使用了 Unicode 5.1 (UTF-8),但也尝试了其他所有方法。由于我的客户使用的是 Excel,我希望我的 .csv 能够正确显示。很烦人
  • 尝试将 BOM 添加到文件中(谷歌搜索)。同样,众所周知,Excel 不擅长编码。如果可能,请使用良好的 3rd 方转换器将数据转换为 .xls。 Apple 的 Numbers 非常适合初学者,OOo 也可以。
  • 感谢您的努力,尽管添加 BOM 并没有任何区别..

标签: php mysql excel csv export


【解决方案1】:

这就是我保存从 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");

希望对你有帮助。

【讨论】:

  • 抱歉,它不起作用。我将 .csv 从 utf8 转换为 ISO-8859-1。我在 Mac 上,如果我将它作为 Windows(ANSI) 导入,它似乎可以工作。不是通过双击文件。也无法识别逗号分隔。我还使用: mysql -uroot db_name -e 'select * from table' > name.csv 导出所有内容。尝试了几个正则表达式进行分离,但没有任何效果。 Concat_WS 将自身添加到标题中。 awk 转换所有空格和 sed 正则表达式总是以“t”字母切割我的桌子。因为我在列(街道名称 nr)中有空格,所以没有什么真正起作用
  • 我可以向您发送我使用 php 完成的 csv 文件,从 MySQL 表中保存 UFT-8 数据。只是为了确保它是与 MacOS Offise 相关的问题。
  • 会很可爱,也许你可以上传它,因为我不知道在这里分享电子邮件:P ty提前
  • 双击:s1.directupload.net/images/130131/n374z64p.png 你可以看到它的标签被分开了。带导入 utf-8:s1.directupload.net/images/130131/sm5xlwm6.png
【解决方案2】:

感谢大家的帮助,我终于设法获得了一个工作 - 可双击的 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 below

b) 使用 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脚本分号.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) 使用 iconv 将字符集从 UTF8 更改为 ISO-8859-1(Windows ANSI Excel 标准):

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

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

也许这对有类似问题的人有帮助。它把我逼疯了。

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

file output.csv

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-30
    • 2019-05-27
    • 1970-01-01
    • 2016-05-31
    • 2019-06-30
    • 1970-01-01
    相关资源
    最近更新 更多