PHP脚本生成的csv中的错误编码

时间:2011-07-05 14:16:37

标签: php macos encoding csv header

MAC用户始终会读取CSV,因此我猜这是Mac问题

我正在用这段代码生成一个csv文件(thx SO:p)

<?php
include("../include/include.php");
$file_new_export = '../temp/new_hve_full.php';
$query = "select * from mytable";
$result = mysql_query($query) or die("Sql error : " . mysql_error());

if (!$result)
    die('Couldn\'t fetch records');
$i = 0;
while ($row = mysql_fetch_assoc($result)) {

    $hve_biodiv = unserialize($row['hve_a']);
    $hve_ferti = unserialize($row['hve_b']);
    $hve_phyto = unserialize($row['hve_c']);
    $hve_irri = unserialize($row['hve_d']);
    $hve_eco = unserialize($row['hve_e']);

    $content[] = array_merge(array_values($hve_a), array_values($hve_b), array_values($hve_c), array_values($hve_d), array_values($hve_e));
    if ($i == 0)
        $headers = array_merge(array_keys($hve_a), array_keys($hve_b), array_keys($hve_c), array_keys($hve_d), array_keys($hve_e));

    $i++;
}

$fp = fopen($file_new_export, 'w');
if ($fp && $result) {

    fwrite($fp, '<?php ');
    fwrite($fp, 'header(\'Content-Type: application/csv; charset=iso-8859-1\');');
    fwrite($fp, 'header(\'Content-Disposition: attachment; filename="export_hve.csv"\');');
    fwrite($fp, 'header(\'Pragma: no-cache\');');
    fwrite($fp, 'header(\'Expires: 0\');');
    fwrite($fp, '?>');

    fputcsv($fp, $headers, ';');
    foreach ($content as $fields) {
        fputcsv($fp, $fields, ';');
    }
    fclose($fp);
}
?>

一切正常但我得到一些错误编码的字母,通常不是“é”我得到“È”它接近但不好......

如果内容类型和文件名转换为html或txt文件,那么所有字符都很好地显示,它似乎只影响csv文件,如果我将excel for mac上的编码切换到西欧它仍然不工作......

不知道该怎么做,我正在寻找一个简单的解决方案,不将所有文件编码为utf8或类似的东西导致有大量数据......根据我的设置,一切都在iso8859-1中( BDD / IDE / PHP编码)...

寻求帮助

7 个答案:

答案 0 :(得分:8)

我应该认为这可以解决你的问题。只需将此行放在php文件的顶部(在任何包含之前):

header('Content-Type: text/html; charset=iso-8859-1');

更多信息:Enconding Type Header

这是因为它会正确编码文件。

GL, Paulo Bueno

答案 1 :(得分:5)

.csv只是简单的文件文本,恰好有结构化数据。文件的内部无法指示使用了哪个字符集。您正在通过“content-disposition:attachment”强制下载文件,因此指示字符集的HTTP标头仅在下载期间生效。之后,它只是硬盘上的另一个文件。

如果您打算将这些数据专门用于Excel,那么我建议使用PHPExcel生成一个真正的Excel文件,该文件不会出现这些翻译问题。

答案 2 :(得分:3)

可怕,可怕。

while循环中有很多混乱的冗余代码 - 你应该在你读输入的同一个循环中写输出。而你不是在编写csv文件 - 你正在编写一个PHP文件 - 这是非常危险的。

include("../include/include.php");
$result = mysql_query("select * from mytable") || die mysql_error();

header('Content-Type: application/csv; charset=iso-8859-1');
header('Content-Disposition: attachment; filename="export_hve.csv"');
while($row = mysql_fetch_assoc($result)) {
  print mkcsv($row) . "\n";
}
exit;
function mkcsv($a)
{
 foreach ($a as $k=>$v) {
   if (!preg_match("/^([0-9.])*$/", $v) {
       $a[$k]="'" . addslashes($v) . "'";
   }
 }
 return implode(',',$a) . "\n";
}

现在,关于这个问题。

您在数据库中使用了哪些字符集?你是如何验证编码错误的?因为你提取它的方式错了?即你是否对数据执行了hexdump并检查0x233是否已转换为0x200?

尝试:

mysql_query('set names latin1');
在执行SELECT语句之前

答案 3 :(得分:1)

您似乎正在通过标头正确设置导出文件的内容类型,但我很好奇,如果问题不在您的数据库字符集中。如果您使用与iso-8859-1不同的字符集将数据存储在MySQL中,那么如果尝试存储/显示,则可能会导致一些时髦的问题。

<小时/> 再嗅一下我发现以下内容:

百科:
http://en.wikipedia.org/wiki/ISO/IEC_8859-1

  

对于通常被错误标记为“ISO-8859-1”的字符编码,请参阅   窗口1252。

<小时/> 的MySQL:
http://dev.mysql.com/doc/refman/5.0/en/charset-mysql.html
要确定数据库的默认字符集,请尝试运行查询:

SHOW VARIABLES;

它返回的列表应该有一个名为

的变量
character_set_database 
来自MySQL Reference的

是:

  

默认数据库使用的字符集。每当默认数据库更改时,服务器都会设置此变量。如果没有默认数据库,则该变量与character_set_server具有相同的值。

答案 4 :(得分:1)

创建UTF8来处理各种各样的字符集,包括法语,西班牙语,...语言集。建议使用UTF8。

也就是说,在PHP中,在Mac平台上工作时,需要使用iconv()函数来执行转换。例如,您可以执行以下操作:

<?php
$unprocessed_string = "Éléphant";
$processed_spring = iconv('MACINTOSH', 'UTF8', $unprocessed_string);
?>

随意将UTF8替换为您想要使用的任何编码类型。

棘手的部分是您可能正在使用包含从其他软件复制的文本的文件。我个人已经注意到这样的文本可能已经是UTF8,在这种情况下,不需要转换。

(编辑)的

附加说明:

这只会影响从文件中操作的内容。如果您在显示内容时仍然遇到问题,请确保使用PHP中的header()函数强制整个页面的编码类型和“charset”。

答案 5 :(得分:0)

您可以尝试使用mb_convert_encoding

对其进行重新编码

答案 6 :(得分:0)

它正在工作。享受
把这行放在fputcsv之前。它将转换为utf8。

foreach ($input_array as $line) {
        $line = array_map("utf8_decode", $line);
        fputcsv($temp_memory, $line, $delimiter);
    }