我在PHP中遇到一个奇怪的问题,希望有人之前已经看过这个问题。
我将Æ字符(AE)存储在设置为utf8的MySql数据库中。我有一个PHP应用程序,可以在我的本地计算机上正确显示浏览器中的字符(Windows 7),但是当在生产中使用相同的代码和数据库(GoDaddy Linux Hosting)时,该字符将被转换为单个ASCII字符( 198),在黑色三角形中显示为可怕的问号。我已经确认两个地方的数据库和代码完全相同。我可以将字节迭代为数组,看看MySql的内容是两个字节,\ 195 \ 134,但PHP发送的内容已经在生产环境中以某种方式转换为单个198.
我已经排除了字符编码的浏览器问题。我在使用utf8编码的所有浏览器中都获得相同的行为。我可以查看原始响应并查看问题。
答案 0 :(得分: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)
选择其中任何一个,所有这些都匹配代码点198十进制的LATIN CAPITAL LETTER AE
。
检查PHP输出的编码设置以及数据库客户端连接,确保所有内容都设置为UTF-8。
答案 1 :(得分: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();