【问题标题】:Character encoding from MySQL to CSV using PHP使用 PHP 从 MySQL 到 CSV 的字符编码
【发布时间】:2014-07-08 16:53:57
【问题描述】:

我遇到了特殊字符的问题,例如当我将 MySQL 查询导出到 CSV 文件时,俄语字符被转换为 ????。我使用了 iconv() 函数,但它不起作用。 我应该怎么做才能解决这个问题。我阅读了不同的帖子,但似乎没有什么对我有用

public function  generateReport($nameReport,$db,$query,$host,$user,$pwd){

        $con = mysql_connect($host,$user,$pwd);
        if (!$con)
        {
            die('Could not connect: ' . mysql_error());
        }
        $db_selected = mysql_select_db($db, $con);

        if (!$db_selected)
        {
            die ("Can\'t use test_db : " . mysql_error());
        }

        $res = mysql_query($query);


        if (!$res) {
            $message  = 'Invalid query: ' . mysql_error() . "\n";
            $message .= 'Whole query: ' . $query;
            die($message);
        }

        $file='/home/'.$nameReport.'.csv';


        $fp = fopen($file,'w') or exit("Unable to open file!");


    if($fp){    

        $row = mysql_fetch_assoc($res);
        $line = "";
        $comma = "";
        foreach($row as $name => $value) {
            $line .= $comma . '"' . str_replace('"', '""', $name) . '"';
            $comma = ",";
        }
        $line .= "\n";
        fputs($fp, $line);

            mysql_data_seek($res, 0);

        while($row = mysql_fetch_assoc($res)) {

            $line = "";
            $comma = "";
            foreach($row as $value) {
                iconv( mb_detect_encoding( $value ), 'UTF-8', $value);
                $line .= $comma . '"' . str_replace('"', '""', $value) . '"';
                $comma = ",";
            }
            $line .= "\n";
            fputs($fp, $line);

        }

    }

        return '/home/'.$nameReport.'.csv';

            }

【问题讨论】:

  • 这是遗留应用程序的一部分吗?我真的希望你不要用过时的mysql_query 接口编写新代码。
  • 它只是写了一个可重用的函数。如果您有更好的建议,我可以更改它。
  • 使用函数没有错。我要说的是mysql_query 是一个已弃用的接口,它已从 PHP 中删除,因此您应该尽可能避免使用它。

标签: php mysql utf-8 character-encoding


【解决方案1】:

为什么不通过 PHP 直接从 MySQL 导出到 CSV?

SELECT field_you_want, other_field_you_want 
FROM your_table
INTO OUTFILE 'c:\\filename.csv' 
FIELDS TERMINATED BY ',' 
ENCLOSED BY '"'
LINES TERMINATED BY '\n';

【讨论】:

  • 我需要通过电子邮件发送这份报告,所以我必须使用 PHP
  • 如果您使用 PHP 发送电子邮件,您仍然可以执行 MySQL 查询来构建 CSV。只需使用您传递选择查询的功能即可附加 CSV 创建部分。类似$query .= "INTO OUTFILE 'c:\\filename.csv' FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n';"
  • 将临时文件转储到驱动器的根目录非常草率。
【解决方案2】:

仅限俄语,您可以试试这个

$value = mb_convert_encoding($value, 'KOI8-R','UTF-8' );
$line .= $comma . '"' . str_replace('"', '""', $value) . '"';
$comma = ",";

对于其他字符集,您必须找到获取字符集信息的方法。 也许,mb_detect_encoding 和 mb_detect_order 或者,如果您从网站获取该文本:来自页面头部定义的服务器标头或字符集...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-09
    • 1970-01-01
    • 2021-02-26
    • 2014-09-27
    相关资源
    最近更新 更多