PHP:将UTF-8字符串转换为Ansi?

问题描述 投票:6回答:3

我根据我在数据库中的值构建了一个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。我怎么能只给Ansi那个?

我试过了:

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

这并没有改变任何事情。

谢谢!

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

php ansi
3个回答
18
投票

尝试:

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

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


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

更多资源:herehere

所以对于那些最终在这个问题上的其他人而言,仅供参考。

以下是MS对此的确切解释:

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


0
投票

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

setlocale(LC_CTYPE, "fr_FR.UTF-8"); //set your own locale
$csv = iconv("UTF-8", "WINDOWS-1252//TRANSLIT//IGNORE", $csv);
© www.soinside.com 2019 - 2024. All rights reserved.