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

the*_*cus 2 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']
        );    
    }
?>
Run Code Online (Sandbox Code Playgroud)

请帮忙.

cmb*_*ley 8

–是一个常见的mojibake为一个短划线(),这是一个与连字符不同的字符.

它是采用UTF-8编码形式的破折号(0xe2 0x80 0x93)并错误地假设它实际上是使用Windows-1252编码的结果.

解读这三个字节的Windows-1252: 0xe2,0x800x93分别表示â,.

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

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

但是,如果您看到C3A2E282ACE2809C,则该字符已在数据库中编码错误 - 即解释不正确,然后保存为这3个字符的UTF-8表示.如果是这种情况,您需要更新数据以解决问题.你可以这样做iconv:

$fixedData = iconv("utf-8", "windows-1252", $badData);
Run Code Online (Sandbox Code Playgroud)

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