PHP 将 utf8 Æ (195 134) 转换为 198


PHP converting utf8 Æ (195 134) to 198

我在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();