1

我在 PHP 中有一个奇怪的问题,希望有人以前见过。

我将 Æ 字符 (AE) 存储在设置为 utf8 的 MySql 数据库中。我有一个 PHP 应用程序可以在我的本地机器(Windows 7)上的浏览器中正确显示字符,但是当在生产中使用相同的代码和数据库(GoDaddy Linux 主机)时,字符被转换为单个 ASCII 字符( 198),它显示为黑色三角形中的可怕问号。我已经确认两个地方的数据库和代码完全相同。我可以将字节作为数组进行迭代,并看到 MySql 输出的是两个字节,\195\134,但是 PHP 发送的内容在生产环境中以某种方式转换为单个 198。

我已经排除了字符编码的浏览器问题。我在所有使用 utf8 编码的浏览器中都得到了相同的行为。我可以查看原始响应并查看问题。

4

2 回答 2

1

如果

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)

选择其中任何一个,都匹配LATIN CAPITAL LETTER AE在代码点 198 十进制。

检查 PHP 输出的编码设置以及所有设置为 UTF-8 的数据库客户端连接。

于 2012-04-17T01:04:04.733 回答
0

我怀疑 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();
于 2012-04-17T01:24:19.363 回答