UTF-8中的特殊字符使用magento以MYSQL中的问号存储为菱形

时间:2016-02-15 10:33:57

标签: php mysql magento encoding utf-8

我正在阅读一个用UTF-8编码的csv,其中包含一些特殊字符,例如ò。我使用htmlentities将UTF-8字符存储到它们的HTML等价物中。但是这些特殊字符在MYSQL db中以问号标记存储为菱形。

我的代码是: -

$fileName = $_FILES['csv_file']['tmp_name'];
ini_set('auto_detect_line_endings', 1);
$fp = fopen($fileName, 'r');

$resource = Mage::getSingleton('core/resource');
$writeAdapter = $resource->getConnection('core_write');
$optionsNumber = 4;

$line = true;
while ($line !== false){
    $names      = array();
    $namesIndex = 0;
    while (($line = fgetcsv($fp, self::MAX_LINE, ',', '"')) !== false) {

        $empty_row = false;
        for ($i = 0; $i < $optionsNumber+1; $i++) {
            $line[$i] = trim($line[$i], "\r\n\t' ".'"');
            $line[$i] = htmlentities($line[$i], ENT_SUBSTITUTE, "UTF-8");

            $sql2 = "insert ignore into `custom_table` ". "(parent_id, options_id, value, p_id) values ". "(:parent_id, :options_id, :value,:p_id)";

            $binds = array(
                'parent_id'      => 0,  
                'options_id'     => 1,
                'value'          => $line[$i],
                'p_id'           => 1,
            );
            $writeAdapter->query($sql2,$binds);
        }       
    }   
}

现在问题是值Motò 6.5存储为Mot� 6.5

有人请指出错误是什么。提前谢谢。

2 个答案:

答案 0 :(得分:1)

它可以有很多起源。例如,您的php文件编码导致的问题。为避免此类问题,您可以遵循以下规则:

  1. 将所有php文件编码为utf8而不是bom
  2. 使数据库/表格/字段使用字符集utf8和排序规则utf8_general_ci
  3. 在连接到您的mysql数据库后立即执行以下查询:"SET NAMES UTF8;"
  4. 在utf8中通过php加载所有数据
  5. 你将永远不会有任何编码问题;)

答案 1 :(得分:0)

请使用以下行

$line[$i] = utf8_encode($line[$i]);

而不是

$line[$i] = htmlentities($line[$i], ENT_SUBSTITUTE, "UTF-8");