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

Posted

技术标签:

【中文标题】UTF-8 中的特殊字符在 MYSQL 中使用 magento 存储为带问号的菱形【英文标题】:Special characters in UTF-8 stored as diamond with question mark in MYSQL using magento 【发布时间】:2016-05-26 05:23:40 【问题描述】:

我正在读取以 UTF-8 编码的 csv,其中包含一些特殊字符,例如 ò 。我使用 htmlentities 将 UTF-8 字符存储到它们的等效 HTML 中。但是这样的特殊字符在 mysql 数据库中被存储为带有问号的菱形。

我的代码是:-

$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

请高人指出错误所在。提前致谢。

【问题讨论】:

【参考方案1】:

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

    所有 php 文件都以 utf8 编码,没有 bom 使数据库/表/字段使用字符集 utf8 和排序规则utf8_general_ci 在连接到您的 mysql 数据库后立即执行以下查询:"SET NAMES UTF8;" 所有数据都由 php 加载到 utf8 中

您将永远不会再遇到任何编码问题 ;)

【讨论】:

还有一个:在HTML输出中,有&lt;meta charset=UTF-8&gt; (排序规则与本次讨论无关。)【参考方案2】:

请使用下面一行

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

而不是

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

【讨论】:

这不会有帮助,它会导致双 utf8 编码的数据,因为他的数据已经是 utf8 也许吧,但你不知道他的 php 文件编码和数据库字符集和排序规则... 是的,这行得通,但不幸的是,它在我的第一个值的开头添加了一些非法字符,例如。为什么会这样? 大声笑,所以你说它有效,但它并不有效?除非您提供所有相关点(如数据库、数据库连接、源文件和数据文件)的字符集、编码和整理信息,否则我们无法判断。 我会解决的。但是,特殊字符被完美存储。非常感谢

以上是关于UTF-8 中的特殊字符在 MYSQL 中使用 magento 存储为带问号的菱形的主要内容,如果未能解决你的问题,请参考以下文章

PHP 和 Mysql UTF-8(特殊字符)的问题

使用 UTF-8 编码,具有特殊属性/外来字符的 CSV 文件在导入 MySQL (phpMyAdmin) 时不保留

无法使用php显示mysql数据库中的特殊字符

在 MySQL 中存储特殊字符

处理 C 中的特殊字符(UTF-8 编码)

特殊 ä ö 字符打破 UTF-8 编码