【问题标题】:Issue displaying Greek text from MySQL db using PHP使用 PHP 从 MySQL db 显示希腊文本的问题
【发布时间】:2017-02-12 18:51:55
【问题描述】:

我有一个托管在 GoDaddy(共享 Windows 服务器)上的网站,我前段时间使用程序 PHP 和 MySQL 数据库编写了该网站。数据库中的某些表包含用户通过某些页面插入的数据,在某些情况下他们插入希腊文本。在过去的 3-4 年里,一切都运行良好,直到最近我被告知该网站由于某种原因而关闭。我联系了 GoDaddy,他们告诉我这一定是我的脚本有问题,但我已经很长时间没有对代码进行任何更改了。无论如何,显然它在我没有做任何事情的情况下在同一天解决了,所以我猜这是他们的服务器的问题,尽管他们告诉我他们方面没有任何改变。

问题在于,从那时起,所有显示从数据库中选择的希腊字符的页面都显示为:Άλλο Î'ίτημα,而不是正确的希腊文本。我知道它们是这样存储在数据库中的(当我使用 phpMyAdmin 访问它时),但我认为直到现在这都是正常的,因为当它们被选择并显示在页面中时它们很好。所以我不知道现在发生了什么,他们不再正确出现。顺便说一句,希腊字符(不是来自数据库)在页面中正确显示。我已经在互联网上搜索了很多关于此的内容,我相信我已经尝试了所有可能的解决方案。我检查过的一些事情(从另一个 SO 答案复制):

  • 所有 PHP 文件都保存为 UTF-8 编码(无 BOM,使用 Notepad++)
  • MySQL数据库,表和列都设置为utf8_unicode_ci
  • PHP 的默认字符集是 UTF-8

我在头文件中使用以下代码:

header('Content-Type: text/html; charset=utf-8');

然后在html头中:

<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />

我使用以下代码连接到我的db连接文件中的数据库:

$dbc = mysqli_connect (DB_HOST, DB_USER, DB_PASSWORD, DB_NAME) OR die ('Could not connect to MySQL: ' . mysqli_connect_error() );
mysqli_set_charset($dbc, 'utf8');

服务器运行 PHP 版本 5.2.17,MySQL 版本为 5.0.96。

另一个奇怪的事情是,当我导出数据库并在本地导入它(使用 XAMPP)并使用与网站上相同的 PHP 文件时,希腊字符会正确显示在页面上。但是,我笔记本电脑上的 XAMPP 运行的是 PHP 5.4.7 版,而 MySQL 是 5.5.27 版。

任何建议将不胜感激。

谢谢

【问题讨论】:

  • 您如何在数据库中保存希腊字母?我的意思是您在数据库中插入数据的查询。
  • 您好@HK007,感谢您的评论。我只使用mysqli_query($connection,$query),其中查询的形式为INSERT INTO table (col1, col2) VALUES ('$val1', '$val2')
  • 在你的数据库连接代码之后使用mysqli_set_charset($connection,"utf8");,并且不要发送任何php头来设置代码中的其他字符集。
  • @HK007 你的意思是header('Content-Type: text/html; charset=utf-8'); 是出现这个问题的原因??
  • 可能是或可能是您多次对其进行编码的原因。因为我也遇到了同样的问题,在我的情况下,我在保存到数据库之前多次编码。

标签: php mysql utf-8 character-encoding


【解决方案1】:

您期待Άλλο Αίτημα 吗?做SELECT HEX(col)...——这是正确的十六进制:CE86 CEBB CEBB CEBF 20...;这将是“双重编码”:C38E E280A0 C38E C2BB C38E C2BB C38E C2BF 20...

了解Mojibake and Double encoding

【讨论】:

  • 您好,感谢您的回复。 SELECT 的结果是这样的:C38EC2A5C38EC2A0C38EC2A3C38EE28098C38EC2A1C38EC2A7...。所以它是双重编码的。那么这个问题有什么可能的解决方案呢?
  • 我尝试在这里阅读Fixes,但我不确定该采取哪种方法.. 请告知。谢谢
  • 请参阅this section of that page,了解如何修复数据。 (很抱歉,该网页如此混乱。)请注意,双重编码有两种情况,具体取决于您的字符集。
  • 谢谢瑞克!我已经替换了所有受影响的列,我可以看到现在它们在 phpmyadmin 中是可读的。但是,我必须在 mysql.php 文件中注释掉行 mysqli_set_charset($dbc, 'utf8'); 才能在页面中正确查看数据(我不知道为什么)。但是,我将如何确保从现在开始在数据库表中正确输入它们?正如我在上面的 cmets 中告诉 HK007,我只是使用 mysqli_query($connection, $query); 将数据插入这些列,其中 $query 的形式为 INSERT INTO table (col1, col2) VALUES ('$val1', '$val2');
  • 刚刚发生了另一件奇怪的事情。所以我更新了包含这些编码希腊字符的所有其余表格,然后尝试刷新之前修复的原始页面。虽然我稍后更新的表格不会影响该页面,但该页面中的数据现在似乎只是用问号(?)显示。我通过 uncommenting 现在使用 mysqli_set_charset($dbc, 'utf8'); 代码解决了它,这解决了问题。但是,如果您知道如何确保从现在开始正确插入/更新这些列,请告诉我。谢谢
【解决方案2】:
default_charset = "utf-8";

使用 htaccess 文件

AddDefaultCharset UTF-8

测试:

<?php header("content-type: text/html;charset=utf-8") ?>
<!doctype>
<html>
<head>
    <meta charset="utf-8">
</head>
<body>
    <?php echo "α β γ δ ε ϝ ϛ ζ η θ ι κ λ μ ν ξ ο π ϟ ϙ ρ σ τ υ φ χ ψ ω ϡ" ?>
</body>

【讨论】:

  • 感谢您的回答,但正如我所说,服务器在 Windows 上,因此没有 htaccess 文件。我还说问题仅在于数据库中的希腊字符,并且所有其他希腊文本(来自 php 脚本)都正确显示。
  • 当浏览数据抛出 phpmyadmin 是数据显示正确还是相同的“Άλλο”?
  • 不,一样。但我认为直到现在这都是正常的,因为当它们被选中并显示在页面中时,它们直到本周都很好。
  • 不,一直都是这样,而且工作正常。这就是它在我的本地主机上的样子(使用 xampp 导出相同的数据库)并且它们正确显示..
  • 尝试使用不同的浏览器,你可以在这里发布任何来自 db 的值
猜你喜欢
  • 1970-01-01
  • 2012-08-02
  • 1970-01-01
  • 2016-07-29
  • 2011-02-07
  • 2014-04-01
  • 1970-01-01
  • 2011-10-26
  • 1970-01-01
相关资源
最近更新 更多