我根据数据库中的值构建了一个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称为UTF-8 。我怎么能只把它给安西呢?
我试过了:
$csv = iconv("ISO-8859-1", "WINDOWS-1252", $csv);
这没有改变任何事情。
谢谢!
解决方案: $ csv = iconv(“UTF-8”,“WINDOWS-1252”,$ csv);
答案 0 :(得分:18)
尝试:
$csv = iconv("UTF-8", "Windows-1252", $csv);
但是你最终会丢失数据,因为ANSI只能编码一小部分UTF-8。如果您没有充分的理由反对它,请提供UTF-8编码的文件。
答案 1 :(得分:5)
由于对ISO-8859-1,Windows-1252&您问题中的ANSI 这里要注意的重要一点是:
所谓的Windows字符集(确切地说是WinLatin1或Windows代码页1252)将一些位置用于可打印字符。因此,Windows字符集与ISO 8859-1不同。 Windows字符集通常称为“ANSI字符集”,但这是严重错误的。它尚未获得ANSI批准。
历史背景:Microsoft基于ANSI标准草案的设计设计。一个glossary by Microsoft explicitly admits this。
对于其他人来说,仅仅是因为这个问题。
以下是MS对此的确切解释:
用于表示Windows代码页的术语“ANSI”是一个历史参考,但现在仍然是在Windows社区中持续存在的误称。其来源于以下事实:Windows代码页1252最初基于ANSI草案,后者成为国际标准化组织(ISO)标准8859-1。 “ANSI应用程序”通常是对非Unicode或基于代码页的应用程序的引用。
答案 2 :(得分:0)
为避免在转换特殊字符时丢失数据,
setlocale(LC_CTYPE, "fr_FR.UTF-8"); //set your own locale
$csv = iconv("UTF-8", "WINDOWS-1252//TRANSLIT//IGNORE", $csv);