【发布时间】: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