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编码)...
寻求帮助
答案 0 :(得分:8)
我应该认为这可以解决你的问题。只需将此行放在php文件的顶部(在任何包含之前):
header('Content-Type: text/html; charset=iso-8859-1');
这是因为它会正确编码文件。
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中,那么如果尝试存储/显示,则可能会导致一些时髦的问题。
<小时/> 再嗅一下我发现以下内容:
对于通常被错误标记为“ISO-8859-1”的字符编码,请参阅 窗口1252。
<小时/> 的MySQL:
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)
foreach ($input_array as $line) {
$line = array_map("utf8_decode", $line);
fputcsv($temp_memory, $line, $delimiter);
}