即使使用<metadata>标签,也无法使编码使用UTF-8?

Mik*_*oud 3 php mysql joomla joomla2.5

我将一个Joomla 1.5网站改为2.5,几乎一切都很顺利,但我正在与一个角色的展示作斗争.在实际站点上有文本“You Agency guys are twisted.”,它显示正常,但在转换后的网站上显示相同的数据库文章?You Agency guys are twisted.?.

现在,我已经验证了这两个元素具有完全相同的计算样式.但感觉就像字体问题.这可能是Joomla 2.5如何编码这个角色的问题吗?

编辑1

评论结束后,我去验证了数据库.我发现character_set_database旧的数据库是latin1和不是utf8,所以我运行了这个声明:

alter database my_database default charset latin1;
Run Code Online (Sandbox Code Playgroud)

现在所有字符集变量在两个数据库之间排列.此外,我验证了页面的字符集是utf-8因为它发出了这个<metadata>标记:

<meta http-equiv="content-type" content="text/html; charset=utf-8">
Run Code Online (Sandbox Code Playgroud)

但是,字符仍然无法正常显示.

编辑2

我也试着设置我default_charsetutf-8为PHP:

default_charset = "utf-8"
Run Code Online (Sandbox Code Playgroud)

在添加该行之前,甚至没有设置,所以它将是我猜测的Apache默认值.

编辑3

我现在还验证了该index.php文件的Content-Type标题是text/html; charset=utf-8.但是,这些特殊字符仍然没有正确显示.

Bra*_*ody 5

MarcB的评论完全正确 - 每层的编码必须相同.要调试它,您需要找到哪个图层的编码不正确.

做这个:

搜索您的PHP源代码并找到执行实际调用的行以从MySQL中选择内容.

此时,十六进制编码字符串并查看原始字节是什么.例如:

// temp, debugging
print("TEST:".bin2hex($whatever_field_value));
die();
Run Code Online (Sandbox Code Playgroud)

看看你得到了什么.正确编码的左UTF-8"智能引用"将给出:e2809c.如果它改为给你一个字节或其他值,那么它不是UTF-8.此时您知道编码问题介于PHP mysqli调用和数据库之间(检查mysql字段的字符集,如果有任何显式设置,表的默认字符集,以及连接的字符集 - 请参阅mysqli_set_charset)

(注意:通过将文本文件保存为UTF-8,然后使用任何二进制编辑器或hexdump -C在Mac/Linux上使用,可以轻松查看字符的UTF-8编码.[注意UTF-8字节顺序马克 - efbbbf有些编辑放在文件的前面,这不是你想要的,忽略那个])

如果在那一点上正确的,那么在文本输出之前再次进行相同的测试(可能在一个Joomla模板文件中).看那里是否正确.

然后在浏览器级别测试它,wget(或curl或其他)页面:

wget http://yoursitename/ -O test.html
Run Code Online (Sandbox Code Playgroud)

(wget Windows用户)

hexdump -C在结果上执行(或在二进制编辑器中打开)并找到引用应该在的位置,并查看原始字节是什么.

如前所述,Content-type HTTP标头和meta content-type标签需要匹配您正在使用的编码(UTF-8) - 因此请检查它(wget -S将显示标题).但是,要意识到您的标题和元标记不仅需要说UTF-8,而且数据实际上必须编码为UTF-8 - 这就是您需要如上所述进行检查的原因.

这将告诉您缩小问题所需的知识,此时您可能已经知道需要做什么来修复,或者至少是设置的哪个特定部分导致了问题.


Jer*_*oek 5

尝试先运行此查询:

mysql_query("SET NAMES 'utf8'");
Run Code Online (Sandbox Code Playgroud)

我最后一次遇到字符集问题是因为即使其他所有内容都是UTF-8(提供的HTML,我编写的代码,数据库表等),数据库连接仍然在另一个字符集中传递所有内容.这应该解决这个问题.

编辑:正如下面的@ null.point3r所提到的,使用以下代码是一个更好的选择,因为转义字符串可能仍然使用错误的编码:

$mysqli->set_charset('utf8')
Run Code Online (Sandbox Code Playgroud)