【问题标题】:PHP: Converting UTF-8 string to Ansi?PHP:将 UTF-8 字符串转换为 Ansi?
【发布时间】:2013-02-18 10:17:51
【问题描述】:

我从数据库中的值构建一个 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);

【问题讨论】:

标签: php ansi


【解决方案1】:

试试:

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

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

【讨论】:

  • 微软就是这个原因。一如既往。
【解决方案2】:

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

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

历史背景:微软基于 ANSI 标准的草案设计了该系列。一个glossary by Microsoft explicitly admits this

更多资源:herehere

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

这是 MS 对此的确切解释:

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

【讨论】:

    【解决方案3】:

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

    setlocale(LC_CTYPE, "fr_FR.UTF-8"); //set your own locale
    $csv = iconv("UTF-8", "WINDOWS-1252//TRANSLIT//IGNORE", $csv);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-30
      • 1970-01-01
      • 2013-03-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多