我的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']
);
}
?>
请帮忙。
答案 0 :(得分:8)
–
), –
是常见的en dash,这是与连字符不同的字符。
这是采用UTF-8编码形式的短划线(0xe2 0x80 0x93
)并错误地假设它实际上是使用Windows-1252进行编码的结果。
将这三个字节解释为Windows-1252:0xe2
,0x80
和0x93
分别代表â
,€
和“
。< / 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编码。