utf8在回显文本中没有正确显示连字符

时间:2013-03-29 00:01:33

标签: php mysql utf-8 character-encoding

我的MySQL数据库设置为utf8_unicode_ci并且我有$ pdo-> exec('SET NAMES“utf8”')作为以下php代码的一部分但是当我从查询中回显文本连字符时 - 看起来喜欢这个â €“。我做错了什么,为什么连字符没有正确显示?

<?php    
    try {
        $pdo = new PDO('mysql:host=localhost;dbname=danville_tpf', 'danville_dan', 'password');
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $pdo->exec('SET NAMES "utf8"');
    } catch (PDOException $e) {
        $output = 'Unable to connect to the database server.';
        include 'output.html.php';
        exit();
    }

    $output = 'Theme Park Database initialized';
    //include 'output.html.php';//

    try {
        $park_id = $_GET['park_id'];
        $query = "SELECT * FROM tpf_parks WHERE park_id = $park_id";
        $result = $pdo->query($query);
    } catch (PDOException $e) {
        $output = 'Unable to connect to the database server.';
        //include 'output.html.php';//
    }

    $output = 'Sucessfully pulled park';
    //include 'output.html.php';//

    foreach ($result as $row) {
        $parkdetails[] = array(
            'name' => $row['name'],
            'blurb' => $row['blurb'],
            'website' => $row['website'],
            'address' => $row['address'],
            'logo' => $row['logo']
        );    
    }
?>

请帮忙。

1 个答案:

答案 0 :(得分:8)

对于mojibake–),

是常见的en dash,这是与连字符不同的字符。

这是采用UTF-8编码形式的短划线(0xe2 0x80 0x93)并错误地假设它实际上是使用Windows-1252进行编码的结果。

将这三个字节解释为Windows-1252:0xe20x800x93分别代表â。< / p>

假设有问题的字符在blurb字段中,如果查询SELECT HEX(blurb) FROM tpf_parks(使用合适的WHERE子句),您将看到有问题字节的十六进制编码。

如果您在其中看到E28093,则数据库值被正确编码为UTF-8,并且客户端或服务器配置中将存在字符编码不匹配。

但是,如果您看到C3A2E282ACE2809C,则该字符在数据库中已被错误编码 - 即解释不正确,则保存为这3个字符的UTF-8表示。如果是这种情况,您需要更新数据以解决问题。您可以使用iconv执行此操作:

$fixedData = iconv("utf-8", "windows-1252", $badData);

这会将双重转换后的字节转换回UTF-8编码。

相关问题