我在PHP中有一个奇怪的问题,希望有人以前见过这个。
我将 Æ 字符 (AE) 存储在设置为 utf8 的 MySql 数据库中。 我有一个PHP应用程序,可以在我的本地机器(Windows 7)的浏览器中正确显示该字符,但是当在生产(GoDaddy Linux Hosting)中使用相同的代码和数据库时,该字符正在转换为单个ASCII字符(198),该字符在黑色三角形中显示为可怕的问号。 我已经确认两个地方的数据库和代码完全相同。 我可以将字节作为数组进行迭代,并看到从 MySql 出来的是两个字节,''195 ''134,但 PHP 发送的内容在生产环境中以某种方式转换为单个 198。
我已经排除了字符编码的浏览器问题。 我在使用 utf8 编码的所有浏览器中都得到了相同的行为。 我可以查看原始响应并查看问题。
if
UTF8: 'xC3'x86 (195 134) - LATIN CAPITAL LETTER AE (U+00C6)
转换为198
,看起来解释为:
ISO-8859-1 'xC6 198 UTF8: 'xC3'x86 LATIN CAPITAL LETTER AE (U+00C6)
ISO-8859-4 'xC6 198 UTF8: 'xC3'x86 LATIN CAPITAL LETTER AE (U+00C6)
ISO-8859-9 'xC6 198 UTF8: 'xC3'x86 LATIN CAPITAL LETTER AE (U+00C6)
ISO-8859-15 'xC6 198 UTF8: 'xC3'x86 LATIN CAPITAL LETTER AE (U+00C6)
Windows 1252 'xC6 198 UTF8: 'xC3'x86 LATIN CAPITAL LETTER AE (U+00C6)
Windows 1254 'xC6 198 UTF8: 'xC3'x86 LATIN CAPITAL LETTER AE (U+00C6)
Windows 1258 'xC6 198 UTF8: 'xC3'x86 LATIN CAPITAL LETTER AE (U+00C6)
选择其中任何一个,它们都与代码点 198 十进制处的LATIN CAPITAL LETTER AE
匹配。
检查 PHP 输出的编码设置以及数据库客户端连接,确保所有内容都设置为 UTF-8。
我怀疑PDO连接是罪魁祸首,但我认为我的初始化代码涵盖了我。 事实证明,它并不适用于所有平台。 除了添加"set names 'utf8'"作为 PDO 属性之外,您还需要(或改为)在使用 PDO 引用之前使用命令实际执行查询。
// This doesn't seem to work on all platforms
$pdo->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAMES 'utf8'");
// This seems like a hack, but it works on GoDaddy Linux Hosting
$sth = $pdo->prepare("set names 'utf8'");
$sth->execute();