【问题标题】:PHP CSV encoding not utf-8PHP CSV 编码不是 utf-8
【发布时间】:2012-12-04 08:33:03
【问题描述】:

我正在使用 PHP 生成一个 CSV 文件并将其保存在硬盘上(我不想下载)。数据库字符集是utf8_general_ci,其中有像度数符号(°)这样的字符,它们在 PHPmyadmin 中完美显示。这些字符需要保存在 CSV 文件中。我所做的一切都是 UTF-8 格式,但文件以编码ISO-8859-1 保存。如果我开始使用 utf8_encode 函数,当我在 excel 或任何其他文本编辑器中将其转换回 UTF-8 时,会显示其他字符 (Â)。我不知道出了什么问题,我花了几个小时追查它,但没有成功。

我试过SET NAMES utf8 只是为了确定它是UTF-8,但这只会导致更多奇怪的字符并且没​​有UTF-8 编码。使用 MySQLi 的 set_charset 也是如此。标头为 Content-type:text/html;charset=UTF-8 时,CSV 仍然没有 utf-8 作为默认编码,也没有任何这些组合。

一些代码:

header("Content-type:text/html;charset=UTF-8");
$rMysqli = new mysqli("localhost", "user", "pass", "database");
$rCSV = fopen("test_".time().".csv", 'w');

$aCSVdata = array($var1, $var2, $var3);
fputcsv($rCSV, $aCSVdata, ",", "\"");

fclose($rCSV);

这几乎就是所有正在发生的事情。只是普通的 CSV 数据,只有特殊字符,例如 °Ø

【问题讨论】:

  • 检查您的 PHP 脚本是否为 UTF-8。另外,你怎么知道这个文件是 ISO-8859-1 的?
  • 在某个程序中打开它并且该程序将文件检测为 ISO-8859 并不意味着什么。这只是意味着程序没有更好的了解并选择了 ISO,并不意味着文件必须以该格式编码。请不要使用utf8_encode。见What Every Programmer Absolutely, Positively Needs To Know About Encodings And Character Sets To Work With TextHandling Unicode Front To Back In A Web App
  • @Rune 从不在 PHP 中使用 SET NAMES。请改用mysql_set_charset()(C-API 函数)。 MySQLi 和 ext/mysql 都直接暴露了这个(虽然我们都知道你不应该使用 ext/mysql,难道我们男孩和女孩;-)),PDO 通过charset DSN 参数暴露它
  • @Rune 好的,那里没有问题(text/html 让我愣了一分钟,但你没有输出文件,所以它不是错误,它是只是没用)-您如何查看文件-在哪个程序中?如果您实际上是在输出文件(将其发送到客户端),则应使用 text/csv 作为内容类型。您可以尝试将字节顺序标记写入文件的开头,但这可能会产生比它解决的问题更多的问题。
  • Office 套件在编码方面是最差的。他们臭名昭著。尝试包含 BOM,MS 产品非常喜欢它。

标签: php csv utf-8 character-encoding iso-8859-1


【解决方案1】:

...cmets 的长篇小说...

Microsoft Office 在编码方面是最差的。它臭名昭著地糟透了

(即除了 Excel 之外一切都很好。)

【讨论】:

    猜你喜欢
    • 2015-03-04
    • 1970-01-01
    • 2012-08-02
    • 1970-01-01
    • 2018-01-16
    • 2014-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多