背景:我正在开发一个WordPress网站,并在BlueHost托管。这是一个订阅网站,我们将在其上发布每日评论,订阅者可以访问我们广泛的html档案和我们的SQL数据库。
我正在使用WordPress插件wpDataTables查询SQL数据库以创建网站上的信息表。这个插件工作得很好,表格都正常显示,包括我认为所谓的“Latin-1 Supplement”字符(例如,à,è,ï,Õ等),这是本文的主题。请注意,使用MySQL For Excel创建并更新了数据库中的SQL表。它们存储在BlueHost SQL默认排序规则中:latin1_sweedish_ci。
Excel工作表是通过粘贴源自MS Word文档的文本和日期来创建的。尽管这种看似复杂的方法,但无论是在插件创建的表格内部还是外部,一切都在网站上正确显示。
有问题的网页来源:wpDataTables插件无法搜索多个字词,并在表格中显示结果,并突出显示找到的字词。所以我创建了一个WordPress页面,其中有三个搜索框和两个和/或单选按钮。我使用mark.js来突出显示找到的搜索词。此页面使用WordPress插入PHP和SOGO添加脚本页眉页脚插件创建表。所有工作除了两个问题:
问题1 :表格不显示Latin-1 Supplement字符,而是我得到了可怕的 。请注意,这些字符可以在表格外的页面部分正确显示。问题只出在表格内的php mySQL查询结果中。
问题2 :还有一个非常特殊的行为,我希望这将是指出问题原因的线索。每当文本“$ 0”(美元符号为零)出现在mySQL查询返回的单元格中,而不是这两个字符时,该表格会显示页面顶部的搜索框以及该页面内的所有php代码。表格的单元格而不是“$ 0”。 (它还将它放在表格单元格中的嵌套表中。)我能找到的唯一引用“$ 0”与preg_replace有关,我没有使用它。
尝试解决方案:我创建了一个测试SQL表,其中所有内容(表和所有行)都设置为UTF-8 general_ci。我使用Excel设置为UTF-8网页上传内容,并通过使用à,è,ï,Õ等字符和十六进制值查询表格单元格的十六进制值来确认内容已正确编码我认为这些角色是正确的。 (例如,TEXT =áÀ+ÈðÄäüï+ó...; HEX = 20C3A1C3802BC388C3B0C384C3A4C3BCC3AF0A2BC3B30A6020 ...)网页标题(meta charset =“UTF-8”)和php代码中的SQL查询(mysqli_set_charset($ conn,'utf8) ');)都设置为UTF-8。
我认为原因可能是:我的猜测要么是:(a)BlueHost可能正在对页面上的php执行某些操作,而该页面返回的是浏览器无法理解的字符。但是,我只是使用Wordpress插件Phpinfo()来显示我的设置,它说default_charset是UTF-8。或者可能(b)当我从查询结果创建表时,下面的代码做错了[更新:我删除了表格编码,大块文本仍显示 s]:
echo "<table border='1'><tr>";
while($row = mysql_fetch_row($result))
{
echo "<tr>";
foreach($row as $cell)
echo "<td>$cell</td>";
echo "</tr>\n";
过去一周我花了无数个小时试图自己解决这个问题。我现在准备提升白色投降旗帜了。我已经搜索过以前的问题和答案,尝试所有建议,没有运气。 (特别感谢Rick James从本页获得的教育:http://mysql.rjweb.org/doc.php/charcoll#diagnosing_charset_issues)。我非常感谢任何人都能提供的任何想法。