8

我从数据库中的值构建一个 csv 字符串。最后的字符串存储在我的 $csv 变量中。

现在我提供这个字符串供下载,如下所示:

header("Content-type: text/csv");
header("Content-Disposition: attachment; filename=whatever.csv");
header("Pragma: no-cache");
header("Expires: 0");

echo $csv;

例如,当我在 Notepad++ 中打开它时,它显示Ansi as UTF-8。我怎样才能将其仅更改为 Ansi?

我试过:

$csv = iconv("ISO-8859-1", "WINDOWS-1252", $csv);

这并没有改变什么。

谢谢!

解决方案: $csv = iconv("UTF-8", "WINDOWS-1252", $csv);

4

3 回答 3

23

尝试:

$csv = iconv("UTF-8", "Windows-1252", $csv);

但是您最终会丢失数据,因为 ANSI 只能编码 UTF-8 的一小部分。如果您没有非常强烈的反对理由,请提供 UTF-8 编码的文件。

于 2013-02-18T10:29:02.877 回答
5

由于您的问题对 ISO-8859-1、Windows-1252 和 ANSI 存在误解,因此需要注意的重要一点是:

所谓的 Windows 字符集(准确地说是 WinLatin1,或 Windows 代码页 1252)使用其中一些位置来存储可打印字符。因此,Windows 字符集与 ISO 8859-1 不同。Windows 字符集通常称为“ANSI 字符集”,但这是严重误导。它尚未获得 ANSI 的批准。

历史背景:微软基于 ANSI 标准的草案设计了该系列。Microsoft的词汇表明确承认了这一点

更多资源:这里这里

因此,对于最终遇到这个问题的其他人,仅供参考。

这是MS对此的确切解释:

用于表示 Windows 代码页的术语“ANSI”是一个历史参考,但现在是一个误称,继续存在于 Windows 社区中。其根源在于 Windows 代码页 1252 最初基于 ANSI 草案(后来成为国际标准化组织 (ISO) 标准 8859-1)。“ANSI 应用程序”通常是对非 Unicode 或基于代码页的应用程序的引用。

于 2013-09-23T10:06:17.967 回答
1

为避免在转换特殊字符时丢失数据:

setlocale(LC_CTYPE, "fr_FR.UTF-8"); //set your own locale
$csv = iconv("UTF-8", "WINDOWS-1252//TRANSLIT//IGNORE", $csv);
于 2019-04-16T19:25:17.993 回答